//~~tv:20010.20140827
//~~tc: Tealium Custom Container
/*
Tealium Custom Container Notes:
- Add sending code between "Start Tag Sending Code" and "End Tag Sending Code".
- Add JavaScript tag library code between "Start Tag Library Code" and "End Tag Library Code".
- Add JavaScript code only, do not add HTML code in this file.
- Remove any tags from the code you place in this file.
Loading external JavaScript files (Loader):
- If you need to load an additional external JavaScript file, un-comment the singe-line JavaScript comments ("//") within the following Loader sections near the bottom of this file:
- "Start Loader Function Call"
- "End Loader Function Call"
- "Start Loader Callback Function"
- "End Loader Callback Function"
- After un-commenting, insert the path to the external JavaScript file you want to load.
- Finally, within the Loader callback function, insert the JavaScript code that should run after the external JavaScript file has loaded.
*/
/* Start Tag Library Code */
/* End Tag Library Code */
//tealium universal tag - utag.sender.custom_container ut4.0.202508160121, Copyright 2025 Tealium.com Inc. All Rights Reserved.
try {
(function (id, loader) {
var u = {};
utag.o[loader].sender[id] = u;
// Start Tealium loader 4.32
// Please do not modify
if (utag === undefined) { utag = {}; } if (utag.ut === undefined) { utag.ut = {}; } if (utag.ut.loader === undefined) { u.loader = function (o) { var a, b, c, l; a = document; if (o.type === "iframe") { b = a.createElement("iframe"); b.setAttribute("height", "1"); b.setAttribute("width", "1"); b.setAttribute("style", "display:none"); b.setAttribute("src", o.src); } else if (o.type === "img") { utag.DB("Attach img: " + o.src); b = new Image(); b.src = o.src; return; } else { b = a.createElement("script"); b.language = "javascript"; b.type = "text/javascript"; b.async = 1; b.charset = "utf-8"; b.src = o.src; } if (o.id) { b.id = o.id; } if (typeof o.cb === "function") { if (b.addEventListener) { b.addEventListener("load", function () { o.cb(); }, false); } else { b.onreadystatechange = function () { if (this.readyState === "complete" || this.readyState === "loaded") { this.onreadystatechange = null; o.cb(); } }; } } l = o.loc || "head"; c = a.getElementsByTagName(l)[0]; if (c) { utag.DB("Attach to " + l + ": " + o.src); if (l === "script") { c.parentNode.insertBefore(b, c); } else { c.appendChild(b); } } }; } else { u.loader = utag.ut.loader; }
// End Tealium loader
u.ev = {'view' : 1};
u.initialized = false;
u.map={};
u.extend=[function(a,b){ try{ if(1){
/******/ (function() { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({
/***/ "./src/widget/utilities/logger.js":
/*!****************************************!*\
!*** ./src/widget/utilities/logger.js ***!
\****************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ mobileACSLoggerService; }
/* harmony export */ });
/* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts");
/* harmony import */ var _utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utilities */ "./src/widget/utilities/utilities.ts");
// @ts-nocheck
function mobileACSLoggerService(label, error) {
if (window.location.href.includes('secure')) {
if (!window.bactm_envSelector) return;
(0,_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Client Logger fired', error);
var errorPayload = {
"payload": [{
"logLevel": "debug",
"entry": "label: ".concat(label, " | error: ").concat(error.message)
}]
};
var domain = window.location.origin.replace('secure', 'mservice');
var errorURL = "".concat(domain).concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.ACS_LOGGER_URL);
fetch(errorURL, {
headers: {
Accept: "application/json",
"Content-Type": "application/json"
},
method: "POST",
body: JSON.stringify(errorPayload),
credentials: 'include'
}).then(function (res) {
console.log(res);
})["catch"](function (e) {
console.log(e);
});
}
;
}
;
/***/ }),
/***/ "./src/widget/events.ts":
/*!******************************!*\
!*** ./src/widget/events.ts ***!
\******************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
/* harmony export */ });
/* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./widget-constants */ "./src/widget/widget-constants.ts");
/* harmony import */ var _widget_api_co_browse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./widget-api/co-browse */ "./src/widget/widget-api/co-browse.ts");
/* harmony import */ var _widget_api_send_disposition_code__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./widget-api/send-disposition-code */ "./src/widget/widget-api/send-disposition-code.ts");
/* harmony import */ var _widget_api_agent_incentive__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./widget-api/agent-incentive */ "./src/widget/widget-api/agent-incentive.ts");
/* harmony import */ var _sales_request__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sales/request */ "./src/widget/sales/request.ts");
/* harmony import */ var _sales_heartbeat__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./sales/heartbeat */ "./src/widget/sales/heartbeat.ts");
/* harmony import */ var _pubsub_post_messages__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./pubsub/post-messages */ "./src/widget/pubsub/post-messages.ts");
/* harmony import */ var _sales_response__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./sales/response */ "./src/widget/sales/response.ts");
/* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utilities/utilities */ "./src/widget/utilities/utilities.ts");
/* harmony import */ var _sales_request_tc_update__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./sales/request-tc-update */ "./src/widget/sales/request-tc-update.ts");
/* harmony import */ var _sales_fetch_refID__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./sales/fetch-refID */ "./src/widget/sales/fetch-refID.ts");
// @ts-nocheck
/** @module base/events */
var ah_tokenReceived = false;
var refIDRequestReceived = false;
var refIDEventData = undefined;
// Need to update for final submit page.
var shouldFireRefIDCheck = function (requestType) {
if (refIDEventData)
return (0,_sales_fetch_refID__WEBPACK_IMPORTED_MODULE_10__["default"])(refIDEventData.title, refIDEventData.detail);
return;
};
/**
* Initializing subscriptions
* @desc Initialize subscriptions. These subscriptions will wait on publishes from the widget
* @example
TealiumPubSub.subscribe(COMETD_REQUEST_DISCONNECT, cometdDisconnect);
TealiumPubSub.subscribe(COMETD_NOTIFY_STOP_TYPING, cometdTyping);
TealiumPubSub.subscribe(COMETD_NOTIFY_START_TYPING, cometdTyping);
TealiumPubSub.subscribe(COMETD_NOTIFY_READ_RECEIPT, cometdTyping);
TealiumPubSub.subscribe(COMETD_REQUEST_CHANNEL, cometdRequestChannel);
TealiumPubSub.subscribe(COMETD_REQUEST_SEND_MESSAGE, cometdSendMessage);
TealiumPubSub.subscribe(COMETD_REQUEST_CHANNEL_SUBSCRIPTION, cometdSubscribeChannel);
*/
/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() {
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_REQUEST, _sales_request__WEBPACK_IMPORTED_MODULE_4__["default"]);
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_HEARTBEAT, _sales_heartbeat__WEBPACK_IMPORTED_MODULE_5__["default"]);
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_QUALIFIED_LEAD, _widget_api_agent_incentive__WEBPACK_IMPORTED_MODULE_3__["default"]);
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_COBROWSE_CONFIGURATION, _widget_api_co_browse__WEBPACK_IMPORTED_MODULE_1__["default"]);
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GWE_SEND_DISPOSITION_CODE, _widget_api_send_disposition_code__WEBPACK_IMPORTED_MODULE_2__["default"]);
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.CANCEL_SITE_SUBS, _pubsub_post_messages__WEBPACK_IMPORTED_MODULE_6__.postToCancelSubsOnSite);
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.CHECK_AH_TOKEN, _pubsub_post_messages__WEBPACK_IMPORTED_MODULE_6__.postToCheckAHToken);
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GRAB_HEARTBEAT_DATA, _sales_response__WEBPACK_IMPORTED_MODULE_7__.grabHeartbeatData);
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_TC_UPDATE, _sales_request_tc_update__WEBPACK_IMPORTED_MODULE_9__["default"]);
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_NATIVE_CHAT, _pubsub_post_messages__WEBPACK_IMPORTED_MODULE_6__.postNativeChatUpdate);
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_FETCH_SESSION, function (title, detail) {
refIDEventData = {
title: title,
detail: detail,
};
shouldFireRefIDCheck("REF_ID_CHECK_RECEIVED");
});
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_8__.logGenesysEvent)(1, 'TealiumPubSub Subscribing', "subscribing: ".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_REQUEST, ", ").concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_HEARTBEAT, ", ").concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_COBROWSE_CONFIGURATION, ", ").concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GWE_SEND_DISPOSITION_CODE, ", ").concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_NATIVE_CHAT, ", ").concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_FETCH_SESSION));
return false;
}
/***/ }),
/***/ "./src/widget/pubsub/add-pub-sub.ts":
/*!******************************************!*\
!*** ./src/widget/pubsub/add-pub-sub.ts ***!
\******************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
/* harmony export */ });
/* harmony import */ var _pub_sub__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pub-sub */ "./src/widget/pubsub/pub-sub.ts");
/* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts");
// @ts-nocheck
/** @module pubsub/add-pub-sub */
/**
* In Borneo we need to add the pub script first
* Will append newly created div to document
* @returns {boolean}
*/
/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() {
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.determineChatEnv)();
(0,_pub_sub__WEBPACK_IMPORTED_MODULE_0__["default"])();
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'PubSub', 'adding TealiumPubSub');
return false;
}
/***/ }),
/***/ "./src/widget/pubsub/bootstrap.ts":
/*!****************************************!*\
!*** ./src/widget/pubsub/bootstrap.ts ***!
\****************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts");
/* harmony import */ var _add_pub_sub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./add-pub-sub */ "./src/widget/pubsub/add-pub-sub.ts");
/* harmony import */ var _subscriptions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./subscriptions */ "./src/widget/pubsub/subscriptions.ts");
/* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts");
// @ts-nocheck
/** @module pubsub/bootstrap */
(0,_add_pub_sub__WEBPACK_IMPORTED_MODULE_1__["default"])();
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.CHAT_INITIALIZATION, function () {
TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.WIDGET_REQUEST_CONFIGURATION, {
spinner: true,
version: (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_3__.whichVersion)(),
container: "chat-placeholder",
name: "www-chat",
language: (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_3__.isSpanish)(),
path: (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_3__.getDomain)(),
options: { skipBabelPolyFill: true },
});
});
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.WIDGET_REQUEST_CONFIGURATION_SUCCESSFUL, _subscriptions__WEBPACK_IMPORTED_MODULE_2__["default"]);
/***/ }),
/***/ "./src/widget/pubsub/placeholder.ts":
/*!******************************************!*\
!*** ./src/widget/pubsub/placeholder.ts ***!
\******************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
/* harmony export */ });
/* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts");
// @ts-nocheck
/** @module pubsub/placeholder */
/**
* Will create div element, add attribute "chat-placeholder"
* Will append newly created div to document
* @returns {boolean}
*/
/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() {
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.logGenesysEvent)(1, 'Placeholder', 'appending div#chat-placeholder to body');
var $div = document.createElement('div');
$div.id = 'chat-placeholder';
document.body.appendChild($div);
return false;
}
/***/ }),
/***/ "./src/widget/pubsub/post-messages.ts":
/*!********************************************!*\
!*** ./src/widget/pubsub/post-messages.ts ***!
\********************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ postChatDetails: function() { return /* binding */ postChatDetails; },
/* harmony export */ postNativeChatUpdate: function() { return /* binding */ postNativeChatUpdate; },
/* harmony export */ postToCancelSubsOnSite: function() { return /* binding */ postToCancelSubsOnSite; },
/* harmony export */ postToCheckAHToken: function() { return /* binding */ postToCheckAHToken; },
/* harmony export */ sendProxyPostMessage: function() { return /* binding */ sendProxyPostMessage; },
/* harmony export */ setMonitoringStatus: function() { return /* binding */ setMonitoringStatus; }
/* harmony export */ });
/* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts");
/* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts");
// @ts-nocheck
var __assign = (undefined && undefined.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (undefined && undefined.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
/**
* PostMessages
* The following script provides the post message scripts that provide communication back and forth
* with the widget. All of the messages will be kept in this file and not set as a function so the
* counters will be remembered and stored.
*
*/
var chatWindow;
var chatSiteHost = "";
var siteInfoFired = false;
function terminateGenesysChat() {
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, "Cancel All Widget Subscriptions", "Suspension of Monitoring Heartbeat Events and All Widget Subs");
TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_SUSPEND_MONITORING);
TealiumPubSub.clearAllSubscriptions();
}
function sendPostMessage(data) {
if (!chatSiteHost && window.bactm_envSelector === "notprod") {
var v6 = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.isV6)();
chatSiteHost = v6 ? Object.values(spaWidgetParams["gt-chat-widget"])[0].siteParams.domains[(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.getCurrentDomain)()].chatSiteHost : Object.values(spaWidgetParams["www-chat"])[0].siteParams
.domains[(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.getCurrentDomain)()].chatSiteHost;
}
if (chatWindow)
chatWindow.postMessage(data, chatSiteHost);
}
function handlePostMessage(event) {
var _a, _b, _c, _d, _e;
var v6 = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.isV6)();
var widgetName = v6 ? "gt-chat-widget" : "www-chat";
if (event.data === "GET_QS_DDO") {
var currentTLD = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.getCurrentDomain)();
chatWindow = (_a = document.getElementById("chatWindow")) === null || _a === void 0 ? void 0 : _a.contentWindow;
chatSiteHost = Object.values(spaWidgetParams[widgetName])[0].siteParams
.domains[currentTLD].chatSiteHost;
chatWindow === null || chatWindow === void 0 ? void 0 : chatWindow.postMessage({
href: window.location.href,
ddo: window.digitalData,
title: window.document.title,
}, chatSiteHost);
}
if (event.data === "AH_COOKIE_SET") {
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishWindow)("AH_COOKIE_SET", {});
}
if (event.data.event === "chatPreSurveyView") {
window.dataCollector.push(event.data);
}
if (event.data.utagInit) {
var v6_1 = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.isV6)();
var widgetName_1 = v6_1 ? "gt-chat-widget" : "www-chat";
var currentTLD = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.getCurrentDomain)();
chatWindow = (_b = document.getElementById("chatWindow")) === null || _b === void 0 ? void 0 : _b.contentWindow;
chatSiteHost = Object.values(spaWidgetParams[widgetName_1])[0].siteParams
.domains[currentTLD].chatSiteHost;
var showDebugConsole = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.queryStringParse)("debugChat") === "1";
// setting chatsite spaParams to local kvp on the widget
_widget_constants__WEBPACK_IMPORTED_MODULE_0__.chatSiteParams.spaParams = (_e = (_d = (_c = event === null || event === void 0 ? void 0 : event.data) === null || _c === void 0 ? void 0 : _c.spaParams) === null || _d === void 0 ? void 0 : _d.siteParams) === null || _e === void 0 ? void 0 : _e.domains;
// triggering pub/sub that data from the chatsite has been received.
var bactmCookies = new bactm.Cookies();
var cookieExists = bactmCookies.get("occtChat");
var occtChatCookie = cookieExists ? JSON.parse(cookieExists) : "";
var chatRefIDFound = occtChatCookie.chatRefID
? occtChatCookie.chatRefID
: "";
var ltsCookieExists = bactmCookies.get("occtChat_lts");
var occtChatLtsCookie = ltsCookieExists
? JSON.parse(ltsCookieExists)
: "";
var agentIDFound = occtChatLtsCookie.secureAgentID
? occtChatLtsCookie.secureAgentID
: "";
var chatIDFound = occtChatLtsCookie.ix_id ? occtChatLtsCookie.ix_id : "";
if (chatIDFound && chatRefIDFound && agentIDFound) {
postNativeChatUpdate(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_NATIVE_CHAT, {
currentWebPage: window.document.title,
CHAT_ID: chatIDFound,
agentID: agentIDFound,
});
}
if (_widget_constants__WEBPACK_IMPORTED_MODULE_0__.chatSiteParams.spaParams && !siteInfoFired) {
TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.SITE_INFO_AVAILABLE, _widget_constants__WEBPACK_IMPORTED_MODULE_0__.chatSiteParams.spaParams);
siteInfoFired = true;
}
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, "Site Info Available", _widget_constants__WEBPACK_IMPORTED_MODULE_0__.chatSiteParams);
var dataToSend = {
utagInit: {
postMessageOrigin: window.location.origin,
showDebugConsole: showDebugConsole,
},
};
sendPostMessage(dataToSend);
}
if (typeof event.data === "string") {
if (event.origin !== chatSiteHost) {
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(2, "Incorrect Post Message Origin", event.origin);
return;
}
switch (event.data) {
case _widget_constants__WEBPACK_IMPORTED_MODULE_0__.CANCEL_WIDGET_SUBS:
terminateGenesysChat();
break;
case _widget_constants__WEBPACK_IMPORTED_MODULE_0__.GRAB_HEARTBEAT_DATA:
TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GRAB_HEARTBEAT_DATA);
break;
case _widget_constants__WEBPACK_IMPORTED_MODULE_0__.CHECK_FOR_SALE:
// eslint-disable-next-line no-unused-expressions
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.whichDomain)() === _widget_constants__WEBPACK_IMPORTED_MODULE_0__.BOFA
? checkForSaleIndicators(digitalData.cart, "digitalData.cart", _widget_constants__WEBPACK_IMPORTED_MODULE_0__.BOFA_SALE_INDICATORS)
: checkForSaleIndicators(digitalData.page.attributes.chat, "digitalData.page.attributes.chat", _widget_constants__WEBPACK_IMPORTED_MODULE_0__.ML_SALE_INDICATORS);
break;
case _widget_constants__WEBPACK_IMPORTED_MODULE_0__.CANCEL_HEARTBEAT:
TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_SUSPEND_MONITORING);
break;
default:
break;
}
}
}
function checkForSaleIndicators(ddoLocation, ddoLocationStr, saleIndicators) {
if (bactm &&
bactm.polyfills &&
bactm.polyfills.object.exists(window, ddoLocationStr)) {
var salePresInd = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.isSalePresent)(ddoLocation);
// eslint-disable-next-line no-unused-expressions
salePresInd
? sendProxyPostMessage(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.INQ_CLIENT_ORDER_NUM, salePresInd)
: saleIndicators.forEach(function (indicator) {
return (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.proxyChatDDO)(ddoLocation, indicator);
});
}
}
function postToCancelSubsOnSite() {
terminateGenesysChat();
sendPostMessage(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.CANCEL_SITE_SUBS);
}
function postToCheckAHToken() {
sendPostMessage(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.CHECK_AH_TOKEN);
}
// This sends the nativeChat data to the chatSite
function postNativeChatUpdate(eventname, dataToSend) {
var nativeChatData = {
message: _widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_NATIVE_CHAT,
dataToSend: dataToSend,
};
sendPostMessage({ vtimData: __assign({}, nativeChatData) });
}
// This is for acs only
function postChatDetails(eventname, dataToSend) {
var chatAgentDetails = {
message: _widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_SET_AGENT_ID,
dataToSend: dataToSend,
};
sendPostMessage({ vtimData: __assign({}, chatAgentDetails) });
}
function setMonitoringStatus(state) {
if (state === void 0) { state = false; }
try {
bactm.ddo.set("page.attributes.chat.monitoring", state);
var monitoringData = {
message: _widget_constants__WEBPACK_IMPORTED_MODULE_0__.SET_MONITORING_STATUS,
monitoringStatus: state,
};
sendPostMessage({ vtimData: __assign({}, monitoringData) });
}
catch (e) {
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, "PM setMonitoringStatus Error", e);
}
}
function sendProxyPostMessage(key, newValue) {
return __awaiter(this, void 0, void 0, function () {
var message;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, window.boa.chat.reload()];
case 1:
_a.sent();
message = _widget_constants__WEBPACK_IMPORTED_MODULE_0__.SEND_PROXY_DATA;
try {
sendPostMessage({
vtimData: { message: message, key: key, newValue: newValue, genesysData: window.genesysData },
});
}
catch (e) { }
return [2 /*return*/];
}
});
});
}
window.addEventListener("message", handlePostMessage.bind(undefined), false);
/***/ }),
/***/ "./src/widget/pubsub/pub-sub.ts":
/*!**************************************!*\
!*** ./src/widget/pubsub/pub-sub.ts ***!
\**************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
/* harmony export */ });
// @ts-nocheck
/* eslint-disable */
/**
* Copyright (c) 2010,2011,2012,2013,2014 Morgan Roderick http://roderick.dk
* License: MIT - http://mrgnrdrck.mit-license.org
*
* https://github.com/mroderick/PubSubJS
*/
/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() {
// TODO in future add interfaces for PubSub to be shared with TealiumPubSub
var PubSub = {};
var messages = {}, lastUid = -1;
function hasKeys(obj) {
var key;
for (key in obj) {
if (obj.hasOwnProperty(key)) {
return true;
}
}
return false;
}
/**
* Returns a function that throws the passed exception, for use as argument for setTimeout
* @alias throwException
* @function
* @param { Object } ex An Error object
*/
function throwException(ex) {
return function reThrowException() {
throw ex;
};
}
function callSubscriberWithDelayedExceptions(subscriber, message, data) {
try {
subscriber(message, data);
}
catch (ex) {
setTimeout(throwException(ex), 0);
}
}
function callSubscriberWithImmediateExceptions(subscriber, message, data) {
subscriber(message, data);
}
function deliverMessage(originalMessage, matchedMessage, data, immediateExceptions) {
var subscribers = messages[matchedMessage], callSubscriber = immediateExceptions ? callSubscriberWithImmediateExceptions : callSubscriberWithDelayedExceptions, s;
if (!messages.hasOwnProperty(matchedMessage)) {
return;
}
for (s in subscribers) {
if (subscribers.hasOwnProperty(s)) {
callSubscriber(subscribers[s], originalMessage, data);
}
}
}
function createDeliveryFunction(message, data, immediateExceptions) {
return function deliverNamespaced() {
var topic = String(message), position = topic.lastIndexOf('.');
// deliver the message as it is now
deliverMessage(message, message, data, immediateExceptions);
// trim the hierarchy and deliver message to each level
while (position !== -1) {
topic = topic.substr(0, position);
position = topic.lastIndexOf('.');
deliverMessage(message, topic, data, immediateExceptions);
}
};
}
function messageHasSubscribers(message) {
var topic = String(message), found = messages.hasOwnProperty(topic) && hasKeys(messages[topic]), position = topic.lastIndexOf('.');
while (!found && position !== -1) {
topic = topic.substr(0, position);
position = topic.lastIndexOf('.');
found = messages.hasOwnProperty(topic) && hasKeys(messages[topic]);
}
return found;
}
function publish(message, data, sync, immediateExceptions) {
message = (typeof message === 'symbol') ? message.toString() : message;
var deliver = createDeliveryFunction(message, data, immediateExceptions), hasSubscribers = messageHasSubscribers(message);
if (!hasSubscribers) {
return false;
}
if (sync === true) {
deliver();
}
else {
setTimeout(deliver, 0);
}
return true;
}
/**
* Publishes the message, passing the data to it's subscribers
* @function
* @alias publish
* @param { String } message The message to publish
* @param {} data The data to pass to subscribers
* @return { Boolean }
*/
PubSub.publish = function (message, data) {
return publish(message, data, false, PubSub.immediateExceptions);
};
/**
* Publishes the the message synchronously, passing the data to it's subscribers
* @function
* @alias publishSync
* @param { String } message The message to publish
* @param {} data The data to pass to subscribers
* @return { Boolean }
*/
PubSub.publishSync = function (message, data) {
return publish(message, data, true, PubSub.immediateExceptions);
};
/**
* Subscribes the passed function to the passed message. Every returned token is unique and should be stored if you need to unsubscribe
* @function
* @alias subscribe
* @param { String } message The message to subscribe to
* @param { Function } func The function to call when a new message is published
* @return { String }
*/
PubSub.subscribe = function (message, func) {
if (typeof func !== 'function') {
return false;
}
message = (typeof message === 'symbol') ? message.toString() : message;
// message is not registered yet
if (!messages.hasOwnProperty(message)) {
messages[message] = {};
}
// forcing token as String, to allow for future expansions without breaking usage
// and allow for easy use as key names for the 'messages' object
var token = 'uid_' + String(++lastUid);
messages[message][token] = func;
// return token for unsubscribing
return token;
};
/**
* Subscribes the passed function to the passed message once
* @function
* @alias subscribeOnce
* @param { String } message The message to subscribe to
* @param { Function } func The function to call when a new message is published
* @return { PubSub }
*/
PubSub.subscribeOnce = function (message, func) {
var token = PubSub.subscribe(message, function () {
// before func apply, unsubscribe message
PubSub.unsubscribe(token);
func.apply(this, arguments);
});
return PubSub;
};
/**
* Clears all subscriptions
* @function
* @public
* @alias clearAllSubscriptions
*/
PubSub.clearAllSubscriptions = function clearAllSubscriptions() {
messages = {};
};
/**
* Clear subscriptions by the topic
* @function
* @public
* @alias clearAllSubscriptions
*/
PubSub.clearSubscriptions = function clearSubscriptions(topic) {
var m;
for (m in messages) {
if (messages.hasOwnProperty(m) && m.indexOf(topic) === 0) {
delete messages[m];
}
}
};
/**
* Removes subscriptions
*
* - When passed a token, removes a specific subscription.
*
* - When passed a function, removes all subscriptions for that function
*
* - When passed a topic, removes all subscriptions for that topic (hierarchy)
* @function
* @public
* @alias subscribeOnce
* @param { String | Function } value A token, function or topic to unsubscribe from
* @example // Unsubscribing with a token
* var token = PubSub.subscribe('mytopic', myFunc);
* PubSub.unsubscribe(token);
* @example // Unsubscribing with a function
* PubSub.unsubscribe(myFunc);
* @example // Unsubscribing from a topic
* PubSub.unsubscribe('mytopic');
*/
PubSub.unsubscribe = function (value) {
var descendantTopicExists = function (topic) {
var m;
for (m in messages) {
if (messages.hasOwnProperty(m) && m.indexOf(topic) === 0) {
// a descendant of the topic exists:
return true;
}
}
return false;
}, isTopic = typeof value === 'string' && (messages.hasOwnProperty(value) || descendantTopicExists(value)), isToken = !isTopic && typeof value === 'string', isFunction = typeof value === 'function', result = false, m, message, t;
if (isTopic) {
PubSub.clearSubscriptions(value);
return;
}
for (m in messages) {
if (messages.hasOwnProperty(m)) {
message = messages[m];
if (isToken && message[value]) {
delete message[value];
result = value;
// tokens are unique, so we can just stop here
break;
}
if (isFunction) {
for (t in message) {
if (message.hasOwnProperty(t) && message[t] === value) {
delete message[t];
result = true;
}
}
}
}
}
return result;
};
window.TealiumPubSub = PubSub;
}
/***/ }),
/***/ "./src/widget/pubsub/subscriptions.ts":
/*!********************************************!*\
!*** ./src/widget/pubsub/subscriptions.ts ***!
\********************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
/* harmony export */ });
/* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts");
/* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts");
/* harmony import */ var _widget_api_configure_cobrowse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../widget-api/configure-cobrowse */ "./src/widget/widget-api/configure-cobrowse.ts");
/* harmony import */ var _sales_response__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../sales/response */ "./src/widget/sales/response.ts");
/* harmony import */ var _post_messages__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./post-messages */ "./src/widget/pubsub/post-messages.ts");
// @ts-nocheck
/** @module pubsub/subscriptions */
/**
* Subscribe Tealium and Sparta widget loader events
* @returns {boolean}
*/
/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() {
var SpartaPubSub = window.sparta.chat.widgetLoader;
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORING_ID_RESPONSE, _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishWindow);
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.PM_SEND_SALE_OCCURRED, _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishWindow);
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_RESPONSE, _sales_response__WEBPACK_IMPORTED_MODULE_3__["default"]);
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.SITE_INFO_AVAILABLE, _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishWindow);
SpartaPubSub.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_COBROWSE_CONFIGURATION, _widget_api_configure_cobrowse__WEBPACK_IMPORTED_MODULE_2__["default"]);
SpartaPubSub.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_FETCH_SESSION, function (_a) {
var detail = _a.detail;
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishTealium)(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_FETCH_SESSION, detail);
});
SpartaPubSub.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_TC_UPDATE, function (_a) {
var detail = _a.detail;
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishTealium)(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_TC_UPDATE, detail);
});
SpartaPubSub.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_NATIVE_CHAT, function (_a) {
var detail = _a.detail;
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishTealium)(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_NATIVE_CHAT, detail);
});
SpartaPubSub.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORING_CLEAR_HEARTBEAT, function () {
return (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishTealium)(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORING_CLEAR_HEARTBEAT);
});
SpartaPubSub.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_SET_AGENT_ID, function (e) {
(0,_post_messages__WEBPACK_IMPORTED_MODULE_4__.postChatDetails)(e.type, e.detail);
});
if (window.digitalData && !window.digitalData.on_internal_page) {
SpartaPubSub.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_QUALIFIED_LEAD, function (_a) {
var detail = _a.detail;
return (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishTealium)(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_QUALIFIED_LEAD, detail);
});
SpartaPubSub.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_REQUEST, function (_a) {
var detail = _a.detail;
return (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishTealium)(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_REQUEST, detail);
});
SpartaPubSub.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GWE_SEND_DISPOSITION_CODE, function (_a) {
var detail = _a.detail;
return (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishTealium)(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GWE_SEND_DISPOSITION_CODE, detail);
});
SpartaPubSub.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_SUSPEND_MONITORING, function () {
return (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishTealium)(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_SUSPEND_MONITORING);
});
}
SpartaPubSub.pub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.TEALIUM_READY_FOR_PUBSUB, {});
return false;
}
/***/ }),
/***/ "./src/widget/pubsub/widget-script-loaded.ts":
/*!***************************************************!*\
!*** ./src/widget/pubsub/widget-script-loaded.ts ***!
\***************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; },
/* harmony export */ loadLegacyChat: function() { return /* binding */ loadLegacyChat; },
/* harmony export */ loadV6Chat: function() { return /* binding */ loadV6Chat; },
/* harmony export */ publishChatInitialization: function() { return /* binding */ publishChatInitialization; },
/* harmony export */ publishWidgetConfigurationError: function() { return /* binding */ publishWidgetConfigurationError; },
/* harmony export */ publishWidgetConfigurationSuccess: function() { return /* binding */ publishWidgetConfigurationSuccess; },
/* harmony export */ spartaLoaderLoadedEvent: function() { return /* binding */ spartaLoaderLoadedEvent; },
/* harmony export */ subscribeWidgetConfiguration: function() { return /* binding */ subscribeWidgetConfiguration; }
/* harmony export */ });
/* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts");
/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../events */ "./src/widget/events.ts");
/* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts");
// @ts-nocheck
/** @module pubsub/widget-script-loaded */
/**
* Once widget configuration load, fires on success
* @returns {boolean}
*/
function publishWidgetConfigurationSuccess() {
TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.WIDGET_REQUEST_CONFIGURATION_SUCCESSFUL, {});
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_2__.logGenesysEvent)(1, 'Widget Configuration Response', "publishing ".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.WIDGET_REQUEST_CONFIGURATION_SUCCESSFUL));
}
/**
* Once widget configuration load, fires on error
* @returns {boolean}
*/
function publishWidgetConfigurationError() {
TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.WIDGET_REQUEST_CONFIGURATION_ERROR, {});
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_2__.logGenesysEvent)(3, 'Widget Configuration Response', "publishing ".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.WIDGET_REQUEST_CONFIGURATION_ERROR));
}
/**
* Subscribes widget configuration event
* @param {string} eventName - name of event
* @param {object} widgetConfiguration - Widget configuration
*/
function subscribeWidgetConfiguration(eventName, widgetConfiguration) {
var v6 = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_2__.isV6)();
if (!v6) {
loadLegacyChat({ widgetConfiguration: widgetConfiguration });
}
else {
widgetConfiguration = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_2__.getV6WidgetConfig)();
loadV6Chat({ widgetConfiguration: widgetConfiguration });
}
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_2__.logGenesysEvent)(1, 'Widget Configuration', widgetConfiguration);
return false;
}
var loadV6Chat = function (_a) {
var widgetConfiguration = _a.widgetConfiguration;
var loaderVersion = widgetConfiguration.loaderVersion;
var v6Config = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_2__.getV6WidgetConfig)();
v6Config.options.onError = function () {
TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.WIDGET_REQUEST_CONFIGURATION_ERROR, {});
console.log("onError");
};
v6Config.options.onLoad = function () {
TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.WIDGET_REQUEST_CONFIGURATION_SUCCESSFUL, {});
console.log("onLoad");
};
window.sparta.widgetLoader[loaderVersion].load(v6Config);
};
var loadLegacyChat = function (_a) {
var widgetConfiguration = _a.widgetConfiguration;
window.sparta.chat.widgetLoader.load(widgetConfiguration);
window.sparta.chat.widgetLoader.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.errorLoadingWidget, publishWidgetConfigurationError);
window.sparta.chat.widgetLoader.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.SPARTA_WIDGET_READY, publishWidgetConfigurationSuccess);
};
/**
* Publish chat initialization
* @returns {boolean}
*/
function publishChatInitialization() {
TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.CHAT_INITIALIZATION, {});
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_2__.logGenesysEvent)(1, 'Chat Initialization', "publishing ".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.CHAT_INITIALIZATION));
return false;
}
/**
* Document set event, sparta event fired.
* @returns {boolean}
*/
function spartaLoaderLoadedEvent() {
(0,_events__WEBPACK_IMPORTED_MODULE_1__["default"])();
publishChatInitialization();
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.WIDGET_REQUEST_CONFIGURATION, subscribeWidgetConfiguration);
return false;
}
/**
* Once widget script has loaded "spartaLoaderLoaded event will
* fire" Event will fire callback "spartaLoaderLoadedEvent"
* @returns {boolean}
*/
/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() {
if (window.sparta && window.sparta.chat && window.sparta.chat.widgetLoader) {
spartaLoaderLoadedEvent();
}
else {
document.addEventListener('chat.spartaLoaderLoaded', spartaLoaderLoadedEvent);
}
return false;
}
/***/ }),
/***/ "./src/widget/pubsub/widget-script.ts":
/*!********************************************!*\
!*** ./src/widget/pubsub/widget-script.ts ***!
\********************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
/* harmony export */ });
/* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts");
/** @module pubsub/widget-script */
/**
* Create a script tag, widget loader version can change. Set type and src
* attribute. If localhost | set to localhost:3005 (widget's default localhost).
* Append loader to body.
* @returns {boolean}
*/
/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() {
var domain = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.getDomain)();
var v6 = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.isV6)();
// Polyfills script
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.logGenesysEvent)(1, 'PolyfillScript', 'creating Babel Polyfills Script');
if (!v6) {
try {
var vtimPolyfills = document.createElement('script');
vtimPolyfills.id = 'vtim-polyfill-script';
var vtimPolyfillsEndpoint = '/spa/widgets/www-chat/3.0.0/spa-assets/components/utilities/platform/babel-polyfill.js?_=' + Date.now();
var vtimPolyfillsURL = domain + vtimPolyfillsEndpoint;
vtimPolyfills.src = vtimPolyfillsURL;
document.head.appendChild(vtimPolyfills);
}
catch (e) {
console.log(e);
}
}
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.logGenesysEvent)(1, 'WidgetScript', 'creating Widget Script');
var loader = document.createElement('script');
loader.id = 'loader-script';
loader.dataset.widgetName = 'chat';
var widgetScriptURI = '/spa/widgets/loader/3.0.1/index.js';
loader.type = 'text/javascript';
loader.src = "".concat(domain).concat(widgetScriptURI);
document.body.appendChild(loader);
return false;
}
/***/ }),
/***/ "./src/widget/sales/fetch-refID.ts":
/*!*****************************************!*\
!*** ./src/widget/sales/fetch-refID.ts ***!
\*****************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; },
/* harmony export */ errorFetchSessionEvent: function() { return /* binding */ errorFetchSessionEvent; },
/* harmony export */ successFetchSessionEvent: function() { return /* binding */ successFetchSessionEvent; }
/* harmony export */ });
/* harmony import */ var _utilities_fetch_with_retry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utilities/fetch-with-retry */ "./src/widget/utilities/fetch-with-retry.ts");
/* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts");
/* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts");
/* harmony import */ var _utilities_get_cookie__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utilities/get-cookie */ "./src/widget/utilities/get-cookie.ts");
/* harmony import */ var _utilities_logger__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utilities/logger */ "./src/widget/utilities/logger.js");
// @ts-nocheck
var __assign = (undefined && undefined.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
/** @module widget-loader/sales/fetch-session */
/**
* Error fetchRefSession Event
* @param {object} response - Error response
* @returns {boolean}
*/
function errorFetchSessionEvent(response) {
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishWindow)(_widget_constants__WEBPACK_IMPORTED_MODULE_2__.GENESYS_REQUEST_FETCH_SESSION_FAILURE, response);
if (bactm && bactm.plugins && bactm.plugins.pixelTag) {
bactm.plugins.pixelTag.firePixelTag("".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_2__.PIXEL_TAG_URL, "?error=").concat(response));
}
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, 'Genesys Request Fetch Session Failure', response);
(0,_utilities_logger__WEBPACK_IMPORTED_MODULE_4__["default"])('getRefIdInfo', response);
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.increaseErrorCount)();
return false;
}
/**
* Success fetchRefSession Event
* @param {object} response - Success response
* @returns {boolean}
*
* success response
* {
* agentID: "6H98FMGB7T7EP9E3VF6QVEDG3S0000DF",
* chatID: "A1D3SFA3JE541234A3D567F8A910"
* }
*/
function successFetchSessionEvent(response) {
// sets flag to true
var currentWebPage = window.document.title;
var agentLTS = bactm.Store('chat', { type: 'cookie' });
// this sets bactm_lts cookie certain sales flow check the bactm_lts cookie rather than the occtChat_lts cookie
agentLTS.set('secureAgentID', response === null || response === void 0 ? void 0 : response.AGENT_ID);
agentLTS.save();
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishWindow)(_widget_constants__WEBPACK_IMPORTED_MODULE_2__.GENESYS_REQUEST_FETCH_SESSION_SUCCESS, response);
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishWindow)(_widget_constants__WEBPACK_IMPORTED_MODULE_2__.GENESYS_REQUEST_NATIVE_CHAT, __assign({ currentWebPage: currentWebPage }, response));
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Genesys Request Fetch Session Success', response);
return false;
}
/**
* Makes fetchSession request
* @param {string} eventName - name of event
* @param {string} refID - reference ID - Device ID (GUID)
* @param {string} traceID - trace ID - allows for debugging and session tracking
*/
/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(event, refID) {
var _a, _b, _c;
try {
if (typeof bactm === 'undefined') {
throw new Error('Fetch Request: Bactm not defined');
}
;
var bactmLtsCookie = (0,_utilities_get_cookie__WEBPACK_IMPORTED_MODULE_3__["default"])('bactm_lts');
var salesRld = (_b = (_a = bactmLtsCookie === null || bactmLtsCookie === void 0 ? void 0 : bactmLtsCookie.chatService) === null || _a === void 0 ? void 0 : _a.RLD) === null || _b === void 0 ? void 0 : _b.toLowerCase().includes('sales');
var secureAgentID = (_c = bactmLtsCookie === null || bactmLtsCookie === void 0 ? void 0 : bactmLtsCookie.chat) === null || _c === void 0 ? void 0 : _c.secureAgentID;
// checking if we have an agentId and if rld is sales, if we have both don't fire refId call
if (salesRld && secureAgentID) {
console.log('The GetRefIDInfo endpoint will not be called because we already have an agentID');
// return;
}
var currentTLD_1 = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.getCurrentDomain)();
var fetchRefIDParams_1 = {
_CHAT_REF_ID: refID,
_TRACE_ID: new Date().getTime()
};
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Fetch Session Request params', fetchRefIDParams_1);
var fireRefIDCheck = function (event, chatSiteDomains) {
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Firing refID fetch', chatSiteDomains);
var genesysFetchSessionEndpointURL = "".concat(chatSiteDomains[currentTLD_1].genesys).concat(_widget_constants__WEBPACK_IMPORTED_MODULE_2__.GENESYS_FETCH_SESSION_ENDPOINT);
(0,_utilities_fetch_with_retry__WEBPACK_IMPORTED_MODULE_0__["default"])(genesysFetchSessionEndpointURL, {
method: 'POST',
body: JSON.stringify(fetchRefIDParams_1),
headers: {
'Content-Type': 'application/json'
},
credentials: 'include'
}).then(successFetchSessionEvent).catch(errorFetchSessionEvent);
};
// if chatSite params have not been received
if (!_widget_constants__WEBPACK_IMPORTED_MODULE_2__.chatSiteParams.spaParams) {
// wait for SITE_INFO_AVAILABLE event, then fire fetch request
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_2__.SITE_INFO_AVAILABLE, fireRefIDCheck);
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Subscribing to SITE_INFO_AVAILABLE', {});
}
else {
// fire fetch request
fireRefIDCheck(_widget_constants__WEBPACK_IMPORTED_MODULE_2__.SITE_INFO_AVAILABLE, _widget_constants__WEBPACK_IMPORTED_MODULE_2__.chatSiteParams.spaParams);
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Fetching RefID', {});
}
}
catch (e) {
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, 'Fetch Session Error', e);
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.increaseErrorCount)();
}
}
/***/ }),
/***/ "./src/widget/sales/genesys-data.ts":
/*!******************************************!*\
!*** ./src/widget/sales/genesys-data.ts ***!
\******************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ _initialize; }
/* harmony export */ });
/* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts");
/* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts");
// @ts-nocheck
/** @module sales/genesys-data.js */
function _prepareData(ddo) {
var ddoChatData = bactm &&
bactm.polyfills &&
bactm.polyfills.object.exists(digitalData, "page.attributes.chat")
? ddo.page.attributes.chat
: {};
var genesysDataFn = {
siteId: function () {
window.inqSiteID = ddoChatData.site_id || ddoChatData.SITE_ID || null;
return window.inqSiteID;
},
language: function (data) {
var language = data.page &&
data.page.pageInfo &&
Array.isArray(data.page.pageInfo) &&
data.page.pageInfo.length > 0
? data.page.pageInfo[0].language
: "";
if (language === "" &&
typeof fsdNavClientOptions !== "undefined" &&
fsdNavClientOptions) {
language = fsdNavClientOptions.locale;
}
if (language === "" &&
data.page &&
data.page.attributes &&
data.page.attributes.chat) {
language = data.page.attributes.chat.LANGUAGE;
}
return language;
},
// eslint-disable-next-line consistent-return
disableChat: function () {
if (window.bactm) {
var cookies = new window.bactm.Cookies();
var mlo = cookies.get("boa_hlts_mlo");
var qs = new window.bactm.QueryString();
var affiliateCode = qs.get("affiliatecode");
return !!(mlo || affiliateCode);
}
},
OID: function (data) {
return data.user ? data.user.online_id : "";
},
authenticated: function (data) {
var _a;
var authenticated = ((_a = data === null || data === void 0 ? void 0 : data.user) === null || _a === void 0 ? void 0 : _a.authenticated)
? data.user.authenticated
: false;
return authenticated;
},
buildName: function (data, filter) {
var firstName = "";
var lastName = "";
var fullName = "";
if (data.user && data.user.name) {
firstName = data.user.name.first || "";
lastName = data.user.name.last || "";
fullName = data.user.name.full || "";
}
switch (filter) {
case "first":
if (firstName === "" && lastName === "") {
return fullName;
}
return firstName;
case "last":
return lastName;
default:
return fullName;
}
},
firstName: function (data) { return genesysDataFn.buildName(data, "first"); },
lastName: function (data) { return genesysDataFn.buildName(data, "last"); },
// eslint-disable-next-line consistent-return
firstOffer: function (data, type) {
if (data.user && data.user.offers && data.user.offers.length > 0) {
for (var offerid in data.user.offers[0]) {
switch (type) {
case "id":
return offerid;
case "code":
return data.user.offers[0][offerid];
default:
}
}
}
else {
return "";
}
},
firstOfferId: function (data) {
return genesysDataFn.firstOffer(data, "id");
},
firstOfferCode: function (data) {
return genesysDataFn.firstOffer(data, "code");
},
state: function (data) {
return data.user ? data.user.state : "";
},
productName: function (data) {
if (!data.product || !Array.isArray(data.product))
return "";
var productNames = [];
for (var i = 0; i < data.product.length; i++) {
productNames.push(data.product[i].productInfo.productName);
}
return productNames.join(",");
},
categories: function (data) {
if (!data.product || !Array.isArray(data.product))
return "";
var categories = [];
for (var i = 0; i < data.product.length; i++) {
categories.push(data.product[i].category.primaryCategory);
}
return categories.join(",");
},
inqClientOrderNum: function (data) {
var value = ddoChatData.inqClientOrderNum;
if (value) {
if (Array.isArray(value) && value.length === 0)
return "";
if (typeof value === "object" &&
Object.keys(value).length === 0 &&
value.constructor === Object)
return "";
if (typeof value === "string" && value === "[]")
return "";
window.inqClientOrderNum = value;
return value;
}
return data && data.cart && data.cart.fulfilmentID
? data.cart.fulfilmentID
: "";
},
inqOrderType: function () {
var value = ddoChatData.inqOrderType;
if (value) {
if (Array.isArray(value) && value.length === 0)
return "";
if (typeof value === "object" &&
Object.keys(value).length === 0 &&
value.constructor === Object)
return "";
if (typeof value === "string" && value === "[]")
return "";
window.inqOrderType = value;
return value;
}
return "";
},
inqOtherInfo: function () {
var value = ddoChatData.inqOtherInfo;
if (value) {
if (Array.isArray(value) && value.length === 0)
return "";
if (typeof value === "object" &&
Object.keys(value).length === 0 &&
value.constructor === Object)
return "";
if (typeof value === "string" && value === "[]")
return "";
window.inqOtherInfo = value;
return value;
}
return "";
},
inqSalesPrices: function () {
var value = ddoChatData.inqSalesPrices;
if (value) {
if (Array.isArray(value) && value.length === 0)
return "";
if (typeof value === "object" &&
Object.keys(value).length === 0 &&
value.constructor === Object)
return "";
if (typeof value === "string" && value === "[]")
return "";
window.inqSalesPrices = value;
return value;
}
return "";
},
inqSalesProducts: function () {
var value = ddoChatData.inqSalesProducts;
if (value) {
if (Array.isArray(value) && value.length === 0)
return "";
if (typeof value === "object" &&
Object.keys(value).length === 0 &&
value.constructor === Object)
return "";
if (typeof value === "string" && value === "[]")
return "";
if (!Array.isArray(value))
value = [value];
window.inqSalesProducts = value;
return value;
}
return "";
},
inqSalesProductTypes: function () {
var value = ddoChatData.inqSalesProductTypes;
if (value) {
if (Array.isArray(value) && value.length === 0)
return "";
if (typeof value === "object" &&
Object.keys(value).length === 0 &&
value.constructor === Object)
return "";
if (typeof value === "string" && value === "[]")
return "";
if (!Array.isArray(value))
value = [value];
window.inqSalesProductTypes = value;
return value;
}
return "";
},
inqSalesQuantities: function () {
var value = ddoChatData.inqSalesQuantities;
if (value) {
if (Array.isArray(value) && value.length === 0)
return "";
if (typeof value === "object" &&
Object.keys(value).length === 0 &&
value.constructor === Object)
return "";
if (typeof value === "string" && value === "[]")
return "";
if (!Array.isArray(value))
value = [value];
window.inqSalesQuantities = value;
return value;
}
return "";
},
preferredRewardsTier: function (data) {
return data.user && data.user.preferred_rewards_tier
? data.user.preferred_rewards_tier
: "";
},
pageID: function (data) {
var _a, _b;
// Assuming dataCollector is an array of objects with an 'event' property
var dataCollector = Array.isArray(window.dataCollector)
? window.dataCollector
: []; // Ensure dataCollector is an array
var pageViews = dataCollector.filter(function (_a) {
var event = _a.event;
return event === "pageview";
});
var pageView = pageViews && Array.isArray(pageViews) && pageViews.length > 0
? pageViews.slice(-1)
: null;
if (data.page &&
data.page.pageInfo &&
Array.isArray(data.page.pageInfo) &&
data.page.pageInfo.length > 0) {
if (pageView &&
Array.isArray(pageView) &&
pageView.length > 0 &&
"pageInfoKey" in pageView[0]) {
return "pageInfoKey" in pageView[0] &&
typeof pageView[0].pageInfoKey === "string" &&
((_a = data.page.pageInfo[pageView[0].pageInfoKey]) === null || _a === void 0 ? void 0 : _a.pageID)
? (_b = data.page.pageInfo[pageView[0].pageInfoKey]) === null || _b === void 0 ? void 0 : _b.pageID
: "";
}
else {
return data.page.pageInfo[0].pageID;
}
}
else {
return "";
}
},
searchQuery: function (data) {
return data.page && data.page.attributes
? data.page.attributes.searchString
: "";
},
searchResult: function (data) {
return data.page && data.page.attributes
? data.page.attributes.searchResults
: "";
},
};
window.genesysData = {
ACCOUNT_TYPE: ddoChatData.account_type,
APPLICATION: genesysDataFn.pageID(ddo),
AUTHENTICATED: genesysDataFn.authenticated(ddo),
BOA_ASSOCIATE: ddoChatData.boa_associate,
BOA_RETIREE: ddoChatData.boa_retiree,
CANCELREASON: ddoChatData.cancel_reason,
CAT: genesysDataFn.categories(ddo),
COMPANY_NAME: ddoChatData.company_name,
CONVERSION_STAGE: ddoChatData.conversion_stage,
CUSTOMER_LOB: ddoChatData.customer_lob,
CUSTOMER_SEGMENT: ddoChatData.customer_segment,
DATA: ddoChatData.data,
DISABLE_CHAT: genesysDataFn.disableChat(),
ENTITLEMENT_CODE: ddoChatData.entitlement_code,
ERROR_COUNT: ddoChatData.error_count,
FIRST_LOGIN: ddoChatData.first_login,
FIRSTNAME: genesysDataFn.firstName(ddo),
inqClientOrderNum: genesysDataFn.inqClientOrderNum(),
inqOrderType: genesysDataFn.inqOrderType(),
inqOtherInfo: genesysDataFn.inqOtherInfo(),
inqSalesPrices: genesysDataFn.inqSalesPrices(),
inqSalesProducts: genesysDataFn.inqSalesProducts(),
inqSalesProductTypes: genesysDataFn.inqSalesProductTypes(),
inqSalesQuantities: genesysDataFn.inqSalesQuantities(),
inqSiteID: genesysDataFn.siteId(),
LANGUAGE: genesysDataFn.language(ddo),
LASTNAME: genesysDataFn.lastName(ddo),
NAM: genesysDataFn.productName(ddo),
ONLINE_ID: genesysDataFn.OID(ddo),
OFR: genesysDataFn.firstOfferId(ddo),
OFFER_CODE: genesysDataFn.firstOfferCode(ddo),
PAGE_TYPE: ddoChatData.PageType,
PAGE_LOADTIME: ddoChatData.page_loadtime,
PREFERRED_REWARDS_TIER: genesysDataFn.preferredRewardsTier(ddo),
PREQUALIFICATION: genesysDataFn.pageID(ddo),
PRODUCT_DISPLAY: genesysDataFn.productName(ddo),
PRODUCT_TYPE: ddoChatData.Product_type,
PRODUCT_VIEW: genesysDataFn.productName(ddo),
PRODUCTSELECTION_PURCHASEFLOW: genesysDataFn.pageID(ddo),
REFERRAL_CAMPAIGN: ddoChatData.referral_campaign,
STATE: genesysDataFn.state(ddo),
SUB_SECTION: ddoChatData.Sub_Section,
TIMEZONE: ddoChatData.timezone,
TOOL_INTERNALSEARCHQUERY: genesysDataFn.searchQuery(ddo),
TOOL_INTERNALSEARCHRESULT: genesysDataFn.searchResult(ddo),
TOPIC_SELECTION: ddoChatData.topic_selection,
};
function validateValue(value) {
var empty = value === "" ||
value === null ||
typeof value === "undefined" ||
!(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.isEmptyArr)(value) ||
!(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.isEmptyObj)(value);
return !empty;
}
for (var item in genesysData) {
if (validateValue(genesysData[item])) {
// eslint-disable-next-line no-continue
continue;
}
else {
delete genesysData[item];
}
}
}
function _reload() {
if ((0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.whichDomain)() === _widget_constants__WEBPACK_IMPORTED_MODULE_1__.MERRILL || (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.whichDomain)() === _widget_constants__WEBPACK_IMPORTED_MODULE_1__.INTERNAL) {
window.genesysData = {};
window.genesysData =
bactm && bactm.ddo
? bactm.ddo.get("page.attributes.chat")
: digitalData.page.attributes.chat;
}
else {
var ddo = window.digitalData;
_prepareData(ddo);
}
return false;
}
function _initialize() {
if ((0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.whichDomain)() === _widget_constants__WEBPACK_IMPORTED_MODULE_1__.MERRILL || (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.whichDomain)() === _widget_constants__WEBPACK_IMPORTED_MODULE_1__.INTERNAL) {
window.genesysData = {};
window.genesysData =
bactm && bactm.ddo
? bactm.ddo.get("page.attributes.chat")
: digitalData.page.attributes.chat;
// eslint-disable-next-line no-unused-vars
var refreshGenesysData = setInterval(_reload, 15000);
}
else {
var ddo = window.digitalData;
_prepareData(ddo);
// eslint-disable-next-line no-unused-vars
var refreshGenesysData = setInterval(_reload, 15000);
}
}
window.boa = window.boa || {};
window.boa.chat = {
init: _initialize,
reload: _reload,
};
/***/ }),
/***/ "./src/widget/sales/grab-data.ts":
/*!***************************************!*\
!*** ./src/widget/sales/grab-data.ts ***!
\***************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ handleGrabData; }
/* harmony export */ });
/* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts");
// @ts-nocheck
var __assign = (undefined && undefined.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
/** @module sales/grab-data */
/**
* Check if two arrays are equal
* @param {Array} arr1 The first array
* @param {Array} arr2 The second array
* @return {Boolean} If true, both arrays are equal
*/
// eslint-disable-next-line func-names
var arraysMatch = function checkArrs(arr1, arr2) {
// Check if the arrays are the same length
if (arr1.length !== arr2.length)
return false;
// Check if all items exist and are in the same order
for (var i = 0; i < arr1.length; i++) {
if (arr1[i] !== arr2[i])
return false;
}
// Otherwise, return true
return true;
};
/**
* Compare two items and push non-matches to object
* @param {*} item1 The first item
* @param {*} item2 The second item
* @param {String} key The key in our object
* @returns {Object} diffs The differences between the objects
*/
// eslint-disable-next-line func-names
var compare = function compareItems(item1, item2, key, diffs) {
// Get the object type
var type1 = Object.prototype.toString.call(item1);
var type2 = Object.prototype.toString.call(item2);
// If type2 is undefined it has been removed
if (type2 === '[object Undefined]') {
// eslint-disable-next-line no-param-reassign
diffs[key] = null;
}
// If items are different types
if (type1 !== type2) {
// eslint-disable-next-line no-param-reassign
diffs[key] = item2;
}
// If an object, compare recursively
if (type1 === '[object Object]') {
var objDiff = diff(item1, item2);
if (Object.keys(objDiff).length > 1) {
// eslint-disable-next-line no-param-reassign
diffs[key] = objDiff;
}
}
// If an array, compare
if (type1 === '[object Array]') {
if (!arraysMatch(item1, item2)) {
// eslint-disable-next-line no-param-reassign
diffs[key] = item2;
}
}
// Else if it's a function, convert to a string and compare
// Otherwise, just compare
if (type1 === '[object Function]') {
if (item1.toString() !== item2.toString()) {
// eslint-disable-next-line no-param-reassign
diffs[key] = item2;
}
}
else if (item1 !== item2) {
// eslint-disable-next-line no-param-reassign
diffs[key] = item2;
}
return diffs;
};
/**
* Find the differences between two objects and push to a new object
* @param {Object} obj1 The original object
* @param {Object} obj2 The object to compare against it
* @return {Object} An object of differences between the two
*/
// eslint-disable-next-line func-names
var diff = function findDifferences(obj1, obj2) {
// Make sure an object to compare is provided
if (!obj2 || Object.prototype.toString.call(obj2) !== '[object Object]') {
return obj1;
}
// Variables
var diffs = {};
// Loop through the first object
for (var i = 0, keys = Object.keys(obj1); i < keys.length; i++) {
diffs = compare(obj1[keys[i]], obj2[keys[i]], keys[i], diffs);
}
// Loop through the second object and find missing items
for (var i = 0, keys = Object.keys(obj2); i < keys.length; i++) {
if (!obj1[keys[i]] && obj1[keys[i]] !== obj2[keys[i]]) {
diffs[keys[i]] = obj2[keys[i]];
}
}
// Return the object of differences
return diffs;
};
/**
* Handle grabbing data
* @returns {object}
*/
function handleGrabData(data, keyboardTimestamp, mouseTimestamp) {
var newData;
if (Object.keys(data).length === 0) {
// eslint-disable-next-line no-param-reassign
data = window.genesysData;
}
else {
newData = window.genesysData;
}
var deltaData = diff(data, newData);
var userKeyboardActivity = keyboardTimestamp;
var userMouseActivity = mouseTimestamp;
var dataToSend;
if (userKeyboardActivity && userMouseActivity) {
dataToSend = __assign(__assign({}, deltaData), { userKeyboardActivity: userKeyboardActivity, userMouseActivity: userMouseActivity });
}
else if (userKeyboardActivity) {
dataToSend = __assign(__assign({}, deltaData), { userKeyboardActivity: userKeyboardActivity });
}
else if (userMouseActivity) {
dataToSend = __assign(__assign({}, deltaData), { userMouseActivity: userMouseActivity });
}
else {
dataToSend = __assign({}, deltaData);
}
TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_HEARTBEAT, dataToSend);
var newOriginalData = __assign(__assign({}, data), newData);
return newOriginalData;
}
/***/ }),
/***/ "./src/widget/sales/heartbeat.ts":
/*!***************************************!*\
!*** ./src/widget/sales/heartbeat.ts ***!
\***************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
/* harmony export */ });
/* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts");
/* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts");
// @ts-nocheck
/** @module sales/heartbeat */
/**
* DigitalDataObject is merged with TCData
* @param {string} eventName - name of event
* @param {string} payload - heartbeat data (DDO Data Values)
* @returns {boolean}
*/
/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(eventName, payload) {
try {
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Monitoring Heartbeat', payload);
_gt.push(['event', 'heartbeat', { data: payload }]);
}
catch (e) {
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, 'Monitoring Heartbeat Error', e);
TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_HEARTBEAT_FAILURE, e);
if (bactm && bactm.plugins && bactm.plugins.pixelTag)
bactm.plugins.pixelTag.firePixelTag("".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.PIXEL_TAG_URL, "?error=").concat(e));
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.increaseErrorCount)();
}
return false;
}
/***/ }),
/***/ "./src/widget/sales/request-tc-update.ts":
/*!***********************************************!*\
!*** ./src/widget/sales/request-tc-update.ts ***!
\***********************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; },
/* harmony export */ errorTCUpdateEvent: function() { return /* binding */ errorTCUpdateEvent; },
/* harmony export */ successTCUpdateEvent: function() { return /* binding */ successTCUpdateEvent; }
/* harmony export */ });
/* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts");
/* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts");
/* harmony import */ var _utilities_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utilities/logger */ "./src/widget/utilities/logger.js");
// @ts-nocheck
/**
* Error tc-update Event
* @param {object} response - Error response
* @returns {boolean}
*/
function errorTCUpdateEvent(response) {
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishWindow)(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_TC_UPDATE_FAILURE, response);
if (bactm && bactm.plugins && bactm.plugins.pixelTag) {
bactm.plugins.pixelTag.firePixelTag("".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.PIXEL_TAG_URL, "?error=").concat(response));
}
(0,_utilities_logger__WEBPACK_IMPORTED_MODULE_2__["default"])('updateChatData', response);
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, 'TC-Update Request Failure', response);
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.increaseErrorCount)();
return false;
}
/**
* Success tc-update Event
* @param {object} response - Success Response
* @returns {boolean}
*
* success response
* {
* "Reason": "Successfully Updated",
* "Id": "TBKKO53JJH26P227A9KCB8BNHG000UCA",
* "IsChatActive": "N"
* }
*/
function successTCUpdateEvent(response) {
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishWindow)(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_TC_UPDATE_SUCCESS, response);
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'GENESYS REQUEST TC UPDATE SUCCESS', response);
return false;
}
/**
* Makes terms and conditions update
* @param {string} eventName - name of event
* @param {object} payload - name of event
* payload example
* "{\"OFFER_MGMT\":[{\"currentUrl\":\"https://www.bankofamerica.com/credit-cards/products/cash-back-credit-card/?campaign=4063778~EK~en_US\",\"referrer\":\"https://www.bankofamerica.com/credit-cards/\",\"productName\":\"Bank of America Customized Cash Rewards Credit Card\",\"tcLink\":\"https://www.bankofamerica.com/credit-cards/terms-and-conditions/?campaignid=4063778&productoffercode=EK&locale=en_US\",\"timeStamp\":\"1:37:31 PM\",\"pageType\":\"research\"},{\"currentUrl\":\"https://www.bankofamerica.com/credit-cards/products/unlimited-cash-back-student-credit-card/\",\"referrer\":\"https://www.bankofamerica.com/credit-cards/student-credit-cards/\",\"productName\":\"Bank of America Unlimited Cash Rewards Credit Card for Students\",\"tcLink\":\"https://www.bankofamerica.com/credit-cards/terms-and-conditions/?campaignid=4063922&productoffercode=S7&locale=en_US\",\"timeStamp\":\"1:48:08 PM\",\"pageType\":\"research\"}]}"
*/
/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(event, _a) {
var chatID = _a.chatID, OFFER_MGMT = _a.OFFER_MGMT;
try {
if (typeof bactm === 'undefined') {
throw new Error('GENESYS REQUEST TC UPDATE REQUEST unable to process');
}
var genesysData_1 = {
OFFER_MGMT: OFFER_MGMT
};
if (chatID && OFFER_MGMT) {
var interactionID = chatID;
var currentTLD_1 = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.getCurrentDomain)();
var GSID = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.getGSID)();
var jsonUserData = JSON.stringify(genesysData_1);
var genesysTCUpdateParams_1 = {
_interaction_id: interactionID,
_userdata: jsonUserData,
_GSID: GSID,
_updateForActiveChatOnly: 'Y'
};
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'GENESYS TERMS AND CONDITIONS UPDATE PARAMS', genesysTCUpdateParams_1);
var fireTCCheck_1 = function (event, chatSiteSpaParams) {
var genesysNativeChatEndpoint = "".concat(chatSiteSpaParams[currentTLD_1].genesys).concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_UPDATE_CHAT_DATA_ENDPOINT);
fetch(genesysNativeChatEndpoint, {
method: 'POST',
body: JSON.stringify(genesysTCUpdateParams_1),
headers: {
'Content-Type': 'application/json'
},
credentials: 'include'
}).then(function (resp) { return resp.json(); }).then(successTCUpdateEvent).catch(errorTCUpdateEvent);
};
// if chatSite params have not been received
if (!_widget_constants__WEBPACK_IMPORTED_MODULE_0__.chatSiteParams.spaParams) {
// wait for SITE_INFO_AVAILABLE event, then fire fetch request
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.SITE_INFO_AVAILABLE, function (eventName, data) { fireTCCheck_1(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.SITE_INFO_AVAILABLE, data); });
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Fetching chatSiteParams for TC Call', {});
}
else {
// fire fetch request
fireTCCheck_1(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.SITE_INFO_AVAILABLE, _widget_constants__WEBPACK_IMPORTED_MODULE_0__.chatSiteParams.spaParams);
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Firing TC Update Fetch request', _widget_constants__WEBPACK_IMPORTED_MODULE_0__.chatSiteParams);
}
}
else {
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, 'Chat ID undefined', chatID);
}
}
catch (e) {
errorTCUpdateEvent(e);
}
}
/***/ }),
/***/ "./src/widget/sales/request.ts":
/*!*************************************!*\
!*** ./src/widget/sales/request.ts ***!
\*************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts");
/* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts");
// @ts-nocheck
var __assign = (undefined && undefined.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
/* eslint-disable */
/** @module sales/request */
/**
* Configure monitoringJS xml, and gtcj for heartbeat
* @param {string} eventName - name of event
* @param {object} requestConfiguration - domain and URI dslResource | httpEndpoint | httpsEndpoint | gtcjEndpoint
* @returns {boolean}
*/
/* harmony default export */ __webpack_exports__["default"] = (function (eventName, requestConfiguration) {
try {
var isMonitoring = bactm.ddo.get('page.attributes.chat.monitoring');
if (isMonitoring)
return;
window._gt = window._gt || [];
var httpsEndpoint = requestConfiguration.httpsEndpoint, httpEndpoint = requestConfiguration.httpEndpoint, resourcePath = requestConfiguration.resourcePath, gtcjEndpoint = requestConfiguration.gtcjEndpoint;
var protocol = (document.location.protocol === 'https:' ? httpsEndpoint : httpEndpoint);
var configuration = {
dslResource: "".concat(protocol, "/").concat(resourcePath),
httpEndpoint: httpEndpoint,
httpsEndpoint: httpsEndpoint,
gtcjEndpoint: gtcjEndpoint,
};
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Monitoring Request', requestConfiguration);
// <--------------------------------------------------------------------------->
// May remove this section because the domain-xml.mins.js is being posted twice.
// This particular posting has no variables with the posting, so initial analysis points to no functional value.
_gt.push(['config', configuration]);
(function (d, s, id, o) {
var _a;
var fs = d.getElementsByTagName(s)[0];
var e;
if (d.getElementById(id))
return;
e = d.createElement(s);
e.id = id;
e.src = o.src;
(_a = fs.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(e, fs);
}(document, 'script', 'domain-xml', {
src: configuration.dslResource,
}));
// <--------------------------------------------------------------------------->
_gt.push(['getIDs', function (IDs) {
var queryStrings = new bactm.QueryString(window.location.href);
var cookies = new bactm.Cookies('occtChat');
var checkCookie = cookies.get('occtChat');
var occtChatCookie = JSON.parse(checkCookie);
var determineNativeChat = (window.location.href.includes('nativeChat=available') ? 'available' : (window.location.href.includes('nativeChat=active') ? 'active' : false)); // need this because bactm.querystring is thrown off by weird urls.
var determineChatID = function () {
if (window.location.href.split('?')[1]) {
if (window.location.href.split('?')[1].split('chatID=')[1]) {
return window.location.href.split('?')[1].split('chatID=')[1].split('&')[0].split('#')[0];
}
}
return undefined;
};
// TODOS: Will look at this later
// const nativeChat = occtChatCookie?.nativeChat || queryStrings.get('nativeChat') || determineNativeChat;
// const chatID = occtChatCookie?.chatID || queryStrings.get('chatID') || determineChatID();
TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORING_ID_RESPONSE, __assign({}, IDs));
}]);
(function (d, s, id, o) {
var _a;
var fs = d.getElementsByTagName(s)[0];
var e;
if (d.getElementById(id))
return;
e = d.createElement(s);
e.id = id;
e.src = o.src;
(_a = fs.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(e, fs);
}(document, 'script', '_gt', {
src: "".concat(configuration.httpsEndpoint, "/").concat(configuration.gtcjEndpoint),
}));
TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_RESPONSE, {});
}
catch (e) {
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, "Monitoring Request Error", e);
TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_RESPONSE_FAILURE, e);
if (bactm && bactm.plugins && bactm.plugins.pixelTag)
bactm.plugins.pixelTag.firePixelTag("".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.PIXEL_TAG_URL, "?error=").concat(e));
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.increaseErrorCount)();
}
return false;
});
/***/ }),
/***/ "./src/widget/sales/response.ts":
/*!**************************************!*\
!*** ./src/widget/sales/response.ts ***!
\**************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ handleMonitoringResponse; },
/* harmony export */ grabHeartbeatData: function() { return /* binding */ grabHeartbeatData; }
/* harmony export */ });
/* harmony import */ var _grab_data__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./grab-data */ "./src/widget/sales/grab-data.ts");
/* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts");
/* harmony import */ var _pubsub_post_messages__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../pubsub/post-messages */ "./src/widget/pubsub/post-messages.ts");
// @ts-nocheck
/** @module sales/response */
var originalData = {};
var mouseEvent;
var keyboardEvent;
document.addEventListener('keyup', function () {
keyboardEvent = Date.now();
});
document.addEventListener('mousemove', function () {
mouseEvent = Date.now();
});
/**
* Handle monitoring response
* @returns {boolean}
*/
function handleMonitoringResponse() {
var heartbeatsSent = 0;
(0,_pubsub_post_messages__WEBPACK_IMPORTED_MODULE_2__.setMonitoringStatus)(true);
var heartbeatTimer = setInterval(function () {
if (document.visibilityState === 'visible') {
if (heartbeatsSent < 20) {
TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_1__.CHECK_AH_TOKEN);
heartbeatsSent++;
}
else {
clearHeartbeat();
}
}
}, 30000);
TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_1__.CHECK_AH_TOKEN);
function clearHeartbeat() {
(0,_pubsub_post_messages__WEBPACK_IMPORTED_MODULE_2__.setMonitoringStatus)(false);
clearInterval(heartbeatTimer);
TealiumPubSub.unsubscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_1__.GENESYS_SUSPEND_MONITORING);
}
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_1__.GENESYS_SUSPEND_MONITORING, clearHeartbeat);
}
function grabHeartbeatData() {
originalData = (0,_grab_data__WEBPACK_IMPORTED_MODULE_0__["default"])(originalData, keyboardEvent, mouseEvent);
}
/***/ }),
/***/ "./src/widget/utilities/fetch-with-retry.ts":
/*!**************************************************!*\
!*** ./src/widget/utilities/fetch-with-retry.ts ***!
\**************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ fetchWithRetry; }
/* harmony export */ });
// @ts-nocheck
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (undefined && undefined.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
// this utility method allows us to properly handle all network request errors
// this also allows us to retry network calls, omit the retry parameter will effectively turn off retries
// example usage:
// import fetchWithRetry from '../utilities/fetch-with-retry'
// import { MAX_ERR_RETRIES } from './widget-constants';
// fetchWithRetry('http://localhost:4000/mock_refID', {
// method: 'POST',
// body: JSON.stringify(body),
// headers: {'Content-Type': 'application/json'}
// }, MAX_ERR_RETRIES)
// .then((response) => console.log('SUCCCESS with retry', response))
// .catch((response) => console.log('ERROR with retry', response));
function fetchWithRetry(url, options, retries) {
if (retries === void 0) { retries = 0; }
return __awaiter(this, void 0, void 0, function () {
var response, sanitizeRetry;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, fetch(url, options)];
case 1:
response = _a.sent();
if (!response.ok) {
sanitizeRetry = Math.abs(retries);
if (sanitizeRetry > 0)
return [2 /*return*/, fetchWithRetry(url, options, sanitizeRetry - 1)];
throw Error(response.statusText);
}
else {
return [2 /*return*/, response.json()];
}
return [2 /*return*/];
}
});
});
}
/***/ }),
/***/ "./src/widget/utilities/get-cookie.ts":
/*!********************************************!*\
!*** ./src/widget/utilities/get-cookie.ts ***!
\********************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ getCookieStorage; }
/* harmony export */ });
/* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts");
// @ts-nocheck
/** @module utilities/get-cookie */
function getCookieStorage(name) {
if (name === void 0) { name = _widget_constants__WEBPACK_IMPORTED_MODULE_0__.COOKIE.NAME; }
var lookup = "".concat(name, "=");
var decodedCookie = decodeURIComponent(document.cookie);
var cookieArr = decodedCookie.split(';');
for (var i = 0; i < cookieArr.length; i += 1) {
var cookie = cookieArr[i];
while (cookie.charAt(0) === ' ') {
cookie = cookie.substring(1);
}
if (cookie.indexOf(lookup) === 0) {
return JSON.parse(cookie.substring(lookup.length, cookie.length));
}
}
return {};
}
/***/ }),
/***/ "./src/widget/utilities/set-cookie.ts":
/*!********************************************!*\
!*** ./src/widget/utilities/set-cookie.ts ***!
\********************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ setCookieStorage; }
/* harmony export */ });
/* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts");
/* harmony import */ var _get_cookie__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./get-cookie */ "./src/widget/utilities/get-cookie.ts");
// @ts-nocheck
/** @module utilities/set-cookie */
function setCookieStorage(payload, cookie) {
if (cookie === void 0) { cookie = _widget_constants__WEBPACK_IMPORTED_MODULE_0__.COOKIE; }
var stringifiedValue = JSON.stringify(Object.assign((0,_get_cookie__WEBPACK_IMPORTED_MODULE_1__["default"])(cookie.NAME), payload));
var isLocal = window.sparta.env === 'local';
var expiry = "; expires=".concat((new Date(Date.now() + (cookie.EXPIRATION * 24 * 60 * 60 * 1000))).toUTCString());
var domain = isLocal ? '' : "; domain=".concat(cookie.DOMAIN);
var secure = (cookie.SECURE && !isLocal) ? '; secure' : '';
var cookieInfo = "".concat(cookie.NAME, "=").concat(stringifiedValue).concat(expiry, "; path=").concat(cookie.PATH).concat(domain).concat(secure);
window.document.cookie = cookieInfo;
}
/***/ }),
/***/ "./src/widget/utilities/utilities.ts":
/*!*******************************************!*\
!*** ./src/widget/utilities/utilities.ts ***!
\*******************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ checkWrap: function() { return /* binding */ checkWrap; },
/* harmony export */ determineChatEnv: function() { return /* binding */ determineChatEnv; },
/* harmony export */ getCurrentDomain: function() { return /* binding */ getCurrentDomain; },
/* harmony export */ getDomain: function() { return /* binding */ getDomain; },
/* harmony export */ getGSID: function() { return /* binding */ getGSID; },
/* harmony export */ getHostName: function() { return /* binding */ getHostName; },
/* harmony export */ getTopLevelDomain: function() { return /* binding */ getTopLevelDomain; },
/* harmony export */ getV6WidgetConfig: function() { return /* binding */ getV6WidgetConfig; },
/* harmony export */ increaseErrorCount: function() { return /* binding */ increaseErrorCount; },
/* harmony export */ isEmptyArr: function() { return /* binding */ isEmptyArr; },
/* harmony export */ isEmptyObj: function() { return /* binding */ isEmptyObj; },
/* harmony export */ isInternal: function() { return /* binding */ isInternal; },
/* harmony export */ isMerrill: function() { return /* binding */ isMerrill; },
/* harmony export */ isSalePresent: function() { return /* binding */ isSalePresent; },
/* harmony export */ isSecureQA: function() { return /* binding */ isSecureQA; },
/* harmony export */ isSpanish: function() { return /* binding */ isSpanish; },
/* harmony export */ isSparta: function() { return /* binding */ isSparta; },
/* harmony export */ isUniversalHeader: function() { return /* binding */ isUniversalHeader; },
/* harmony export */ isV6: function() { return /* binding */ isV6; },
/* harmony export */ logGenesysEvent: function() { return /* binding */ logGenesysEvent; },
/* harmony export */ mockRefID: function() { return /* binding */ mockRefID; },
/* harmony export */ proxyChatDDO: function() { return /* binding */ proxyChatDDO; },
/* harmony export */ publishTealium: function() { return /* binding */ publishTealium; },
/* harmony export */ publishWindow: function() { return /* binding */ publishWindow; },
/* harmony export */ qsLobSetter: function() { return /* binding */ qsLobSetter; },
/* harmony export */ queryStringParse: function() { return /* binding */ queryStringParse; },
/* harmony export */ whichDomain: function() { return /* binding */ whichDomain; },
/* harmony export */ whichVersion: function() { return /* binding */ whichVersion; }
/* harmony export */ });
/* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts");
/* harmony import */ var _pubsub_post_messages__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../pubsub/post-messages */ "./src/widget/pubsub/post-messages.ts");
/* harmony import */ var _get_cookie__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./get-cookie */ "./src/widget/utilities/get-cookie.ts");
/* harmony import */ var _set_cookie__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./set-cookie */ "./src/widget/utilities/set-cookie.ts");
/** @module utilities/utilities */
/**
* isInternal
* We will check the url for internal sites to default them to source URL for widget
* @returns {boolean}
*/
function isInternal() {
return (window.location.href.indexOf("//ghrsiebel") > -1 ||
window.location.href.indexOf("//aconline") > -1 ||
window.location.href.indexOf("//askhr") > -1);
}
/**
* isMerrill
* We will check the url for .ml or .merrilledge and if so then it is a Merrill configuration
* @returns {boolean}
*/
function isMerrill() {
return (window.location.host.indexOf(".ml") > -1 ||
window.location.host.indexOf(".merrilledge") > -1);
}
/**
* isSparta
* We will check the url for sparta. and if so then it is on a Sparta site
* @returns {boolean}
*/
function isSparta() {
return window.location.host.indexOf("sparta.") > -1;
}
/**
* isSecureQA
* QA5 and QAPS are unable to load dev/cert domains. This already happens natural for www,
* but secure will need to be routed
* @returns {boolean}
*/
function isSecureQA() {
return (window.location.host.indexOf("-qa5") > -1 ||
window.location.host.indexOf("-qaps") > -1);
}
/**
* whichDomain
* This will be utilize to determine which widgetScript to load; which domain to point
* when referencing the widget, and to determine which preconnect/polling attributes to pull
* @returns {string}
*/
function whichDomain() {
if (isMerrill()) {
return _widget_constants__WEBPACK_IMPORTED_MODULE_0__.MERRILL;
}
if (isInternal()) {
return _widget_constants__WEBPACK_IMPORTED_MODULE_0__.INTERNAL;
}
if (isSparta()) {
return _widget_constants__WEBPACK_IMPORTED_MODULE_0__.SPARTA;
}
return _widget_constants__WEBPACK_IMPORTED_MODULE_0__.BOFA;
}
/**
* We have two different language versions of chat. A Spanish version and an English version. We
* will load the corresponding version that relates to language value of the page.
* @returns {string}
*/
function isSpanish() {
var spanishIdentifiers = ["es-us", "es", "spanish", "espanol"];
var language = window.genesysData && window.genesysData.LANGUAGE
? window.genesysData.LANGUAGE
: "en";
// eslint-disable-next-line no-shadow
var isSpanish = false;
if (typeof language === "string" &&
spanishIdentifiers.indexOf(language.toLowerCase()) > -1) {
isSpanish = true;
}
return isSpanish ? "es" : "en";
}
/**
* queryStringParse
* Used to parse out query string values to provide a modified chat experience in LLEs
* @param {string} name - name for query string to parse
* @returns {string}
*/
function queryStringParse(name) {
var url = window.location.href;
var regex = new RegExp("[?&]".concat(name, "(=([^]*)|&|#|$)"));
var results = regex.exec(url);
if (results && results[2])
return decodeURIComponent(results[2]);
return "";
}
/**
* whichVersion
* We will now have multiple versions of www-chat/secure-chat.
* So we will check for which version to use which will be sent as a parameter
* attached to a query string
* @returns {string}
*/
function whichVersion() {
var v6 = isV6();
if (!v6) {
if (window.bactm_envSelector === "notprod") {
var version = queryStringParse("widgetVersion");
if (version !== "")
return version;
return "3.0.0";
}
return "3.0.0";
}
return "1.0.0";
}
/**
* get V6 widget configuration
* @returns {string}
*/
function getV6WidgetConfig() {
var gtChatWidget = {
name: "gt-chat-widget",
version: "1.0.0",
path: getDomain(),
spinner: false,
loaderVersion: "6.0.5",
container: "#chat-placeholder",
options: {
data: { v6: true },
withoutCredentials: true,
}
};
return gtChatWidget;
}
/**
* Identify if version is V6
*
* Collaborators code for V5 or V6 identification
*
*
*/
function isV6() {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
var isV6 = false;
var queryParams = new URLSearchParams(window.location.search); // Parse query string
var queryEnabled = queryParams.get("v6") === "true"; // Check if v6 exists and is "true"
var ddoEnabled = Array.isArray((_b = (_a = window === null || window === void 0 ? void 0 : window.digitalData) === null || _a === void 0 ? void 0 : _a.page) === null || _b === void 0 ? void 0 : _b.pageInfo)
? (_e = (_d = (_c = window.digitalData.page.pageInfo[0]) === null || _c === void 0 ? void 0 : _c.attributes) === null || _d === void 0 ? void 0 : _d.chat) === null || _e === void 0 ? void 0 : _e.v6
: (_k = (_j = (_h = (_g = (_f = window === null || window === void 0 ? void 0 : window.digitalData) === null || _f === void 0 ? void 0 : _f.page) === null || _g === void 0 ? void 0 : _g.pageInfo) === null || _h === void 0 ? void 0 : _h.attributes) === null || _j === void 0 ? void 0 : _j.chat) === null || _k === void 0 ? void 0 : _k.v6;
if (queryEnabled || ddoEnabled)
isV6 = true;
return isV6;
}
/**
* getDomain
* Function designed to automate the URL process regardless of site or location of chat.
* @returns {string}
*/
function getDomain() {
var isProd = window.bactm_envSelector === "prod";
if (!isProd) {
var env = queryStringParse("chatEnv");
if (env !== "")
return "https://www-".concat(env, ".ecnp.bankofamerica.com");
if (window.location.host.indexOf("localhost") > -1)
return "http://localhost:3005";
}
switch (whichDomain()) {
case _widget_constants__WEBPACK_IMPORTED_MODULE_0__.BOFA:
if (isProd) {
return "https://www.bankofamerica.com";
}
var hostName = window.location.hostname.toLowerCase();
if (hostName.indexOf("sit1") > -1 || hostName.indexOf("preview1") > -1) {
return "https://www-sit1a-helix.ecnp.bankofamerica.com";
}
if (hostName.indexOf("sit2") > -1 || hostName.indexOf("preview2") > -1) {
return "https://www-sit2a-helix.ecnp.bankofamerica.com";
}
for (var i = 0; i < _widget_constants__WEBPACK_IMPORTED_MODULE_0__.BOFA_DOMAINS.length; i++) {
if (window.location.hostname.indexOf(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.BOFA_DOMAINS[i]) > -1) {
return "https://www-".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.BOFA_DOMAINS[i], "ecnp.bankofamerica.com");
}
}
return "https://www-".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.IR_ENV.CERT, "-helix.ecnp.bankofamerica.com");
case _widget_constants__WEBPACK_IMPORTED_MODULE_0__.MERRILL:
if (isProd) {
var mlDomain = getCurrentDomain();
return "https://chatui.".concat(mlDomain);
}
else {
var hn = window.location.hostname;
var CERT = _widget_constants__WEBPACK_IMPORTED_MODULE_0__.IR_ENV.CERT, DEV = _widget_constants__WEBPACK_IMPORTED_MODULE_0__.IR_ENV.DEV;
var determineCert = hn.includes("pl1") ||
hn.includes("pl2") ||
hn.includes("sit1") ||
hn.includes("sit2");
if (hn.includes("merrilledgesit1"))
return "https://chatui.merrilledgesit1.com";
if (hn.includes("merrilledgesit2"))
return "https://chatui.merrilledgesit2.com";
if (hn.includes("fssit1.ml.com"))
return "https://chatui.fssit1.ml.com";
if (hn.includes("fssit2.ml.com"))
return "https://chatui.fssit2.ml.com";
if (hn.includes("benefitssit2.ml.com"))
return "https://chatui.benefitssit2.ml.com";
if (hn.includes("benefitssit1.ml.com"))
return "https://chatui.benefitssit1.ml.com";
if (hn.includes("secure-dev3.oldif"))
return "https://chatui-dev3.ml.com";
if (determineCert)
return "https://chatui-".concat(CERT, ".ml.com");
return "https://chatui-".concat(DEV, ".ml.com");
}
case _widget_constants__WEBPACK_IMPORTED_MODULE_0__.INTERNAL:
if (isProd) {
return "https://www.bankofamerica.com";
}
// eslint-disable-next-line no-case-declarations
var intEnv = window.location.hostname.includes("-uat") ||
window.location.hostname.includes("qa.")
? _widget_constants__WEBPACK_IMPORTED_MODULE_0__.IR_ENV.CERT
: _widget_constants__WEBPACK_IMPORTED_MODULE_0__.IR_ENV.DEV;
return "https://www-".concat(intEnv, "-helix.ecnp.bankofamerica.com");
case _widget_constants__WEBPACK_IMPORTED_MODULE_0__.SPARTA:
// eslint-disable-next-line no-case-declarations
var spartaEnv = queryStringParse("environment");
if (spartaEnv !== "" && spartaEnv.startsWith("https"))
return spartaEnv;
return "https://www-".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.IR_ENV.DEV, "-helix.ecnp.bankofamerica.com");
default:
return "https://www-".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.IR_ENV.CERT, "-helix.ecnp.bankofamerica.com");
}
}
/**
* isEmptyObj
* Function designed to check if an object is empty (returns true) or contains
* key/value pairs (returns false)
* @returns {boolean}
*/
function isEmptyObj(obj) {
if (typeof obj === "object") {
for (var key in obj) {
// eslint-disable-next-line no-prototype-builtins
if (obj.hasOwnProperty(key))
return false;
}
return true;
}
return true;
}
/**
* isEmptyArr
* Function designed to check if an array is empty (returns true) or contains items (returns false)
* @param {array} arr
* @returns {boolean}
*/
function isEmptyArr(arr) {
return !(Array.isArray(arr) && arr.length === 0);
}
/**
* isSalePresent
* Function designed to check through the digitalData object for the presence of all the
* possible sale indicators
* @param {Record} ddo - the digitalData object on the window
* @returns {string} - if defined
* @returns {null} - if undefined
*/
function isSalePresent(ddo) {
var saleIndicators = whichDomain() === _widget_constants__WEBPACK_IMPORTED_MODULE_0__.BOFA ? _widget_constants__WEBPACK_IMPORTED_MODULE_0__.BOFA_SALE_INDICATORS : _widget_constants__WEBPACK_IMPORTED_MODULE_0__.ML_SALE_INDICATORS;
for (var i = 0; i < saleIndicators.length; i++) {
if (ddo[saleIndicators[i]] &&
ddo[saleIndicators[i]] !== null &&
ddo[saleIndicators[i]] !== "") {
return ddo[saleIndicators[i]];
}
}
return null;
}
/**
* proxyChatDDO
* Function designed to set mutation observer on DDO
* @param {object} obj - ddo object to be observing
* @param {string} key - key value that is listened for
* @return {bool}
*/
function proxyChatDDO(obj, key) {
var oldValue = obj[key];
Object.defineProperty(obj, key, {
get: function () {
return oldValue;
},
set: function (newValue) {
logGenesysEvent(2, "Bactm Proxy DDO Change", "newValue: ".concat(newValue));
oldValue = newValue;
// eslint-disable-next-line no-param-reassign
if (key === "applicationID")
key = _widget_constants__WEBPACK_IMPORTED_MODULE_0__.INQ_CLIENT_ORDER_NUM;
(0,_pubsub_post_messages__WEBPACK_IMPORTED_MODULE_1__.sendProxyPostMessage)(key, newValue);
},
});
}
/**
* increaseErrorCount
* Function designed to count every time that an error occurs. Once 3 errors occur,
* publish will occur to shutdown chat on widget and site
*/
function increaseErrorCount() {
if (bactm && bactm.ddo) {
var errorCount = bactm.ddo.get("page.attributes.chat.genesys_error_count") || 0;
errorCount++;
bactm.ddo.set("page.attributes.chat.genesys_error_count", errorCount);
if (errorCount === _widget_constants__WEBPACK_IMPORTED_MODULE_0__.MAX_ERR_RETRIES)
TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.CANCEL_SITE_SUBS);
}
}
/**
* getHostName
* Extracts hostname from URL String
* @param {string} url to extract hostname
* @returns {string} hostname
*/
function getHostName(url) {
var match = url.match(/:\/\/(www[0-9]?\.)?(.[^/:]+)/i);
if (match != null &&
match.length > 2 &&
typeof match[2] === "string" &&
match[2].length > 0) {
return match[2];
}
return null;
}
/**
* getTopLevelDomain
* Extract TLD from URL string
* @param {string} url to extract tld
* @returns {string} top level domain
*/
function getTopLevelDomain(url) {
var merrillTLDs = [
// goes from most specific to least specific
"merrilledgesit1.com",
"merrilledgesit2.com",
"fssit1.ml.com",
"fssit2.ml.com",
"benefitssit1.ml.com",
"benefitssit2.ml.com",
"ml.com",
"merrilledge.com",
];
if (url.includes("bankofamerica.com") || url.includes("localhost"))
return "bankofamerica.com";
return merrillTLDs.filter(function (tld) { return url.includes(tld); })[0];
}
/**
* getCurrentDomain
* Obtains the current TLD domain from current window.location.href
* @returns {string} Current TLD
*/
function getCurrentDomain() {
if (window.location.origin === "http://localhost:4000") {
return "localhost";
}
return getTopLevelDomain(window.location.origin);
}
/**
* Publish to window
* @param {string} eventName - name on event
* @param {object} payload - Events payload
* @returns {boolean}
*/
function publishWindow(eventName, payload) {
window.sparta.chat.widgetLoader.pub(eventName, payload);
return false;
}
/**
* Publish to Tealium
* @param {string} eventName - name on event
* @param {object} payload - Events payload
* @returns {boolean}
*/
function publishTealium(eventName, payload) {
TealiumPubSub.publish(eventName, payload);
return false;
}
/**
* Determine Chat Environment
* @returns {boolean}
*/
function determineChatEnv() {
if (window.bactm_envSelector)
return;
if (window.nucleus) {
window.bactm_envSelector = window.nucleus.state().toJS().cms
.environmentVariables.isProd
? "prod"
: "notprod";
}
else {
window.bactm_envSelector = "notprod";
}
}
/**
* Log Genesys Event
* @param {eventName} - Name of the genesys event
* @param {info} - Other information that needs to be collected
* @returns {void}
*/
function logGenesysEvent(levelNum, eventName, data) {
if (window.bactm_envSelector === "prod")
return;
if (!window.bactm) {
window.bactm = {};
window.bactm.chat_dataCollector = [];
}
var levelNumEvents = {
1: "info",
2: "warn",
3: "error",
};
var level = levelNumEvents[levelNum];
var newEvent = {
eventName: eventName,
data: data,
};
var debugChat = queryStringParse("debugChat");
if (debugChat === "1") {
// eslint-disable-next-line no-console
console.groupCollapsed("Bactm Genesys Chat - ".concat(eventName));
// eslint-disable-next-line no-console
console.info({ data: data, level: level });
// eslint-disable-next-line no-console
console.groupEnd();
}
window.bactm.chat_dataCollector.push({ level: level, newEvent: newEvent });
}
// /**
// * checkIfNative
// * Checks querystring for nativeChat flag
// * @returns {string}
// */
// export const checkIfNativeChat = (parentWindow = window.parent) => {
// const urlParams = new URLSearchParams(parentWindow.location.search);
// const bactmCookies = new bactm.Cookies()
// const checkCookie = bactmCookies.get('occtChat');
// const occtChatCookie = checkCookie ? JSON.parse(checkCookie) : "";
// return urlParams.get("nativeChat") === null
// ? (occtChatCookie.nativeChat
// ? occtChatCookie.nativeChat
// : "")
// : urlParams.get("nativeChat").toLowerCase()
// };
// /**
// * checkChatID
// * Checks querystring for chatID flag
// * @returns {string}
// */
// export const checkChatID = (parentWindow = window.parent) => {
// const urlParams = new URLSearchParams(parentWindow.location.search);
// const bactmCookies = new bactm.Cookies()
// const checkCookie = bactmCookies.get('occtChat');
// const occtChatCookie = checkCookie ? JSON.parse(checkCookie) : "";
// return urlParams.get('chatID') === null
// ? (occtChatCookie.chatID
// ? occtChatCookie.chatID
// : '')
// : urlParams.get('chatID');
// };
var checkWrap = function (parentWindow) {
if (parentWindow === void 0) { parentWindow = window.parent; }
return window.location.href.includes("wrap=MDA") ? "Y" : "N";
};
/**
* getGSID
* @returns null || string
*/
function getGSID() {
var gsid = (0,_get_cookie__WEBPACK_IMPORTED_MODULE_2__["default"])(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.COOKIE_GSID);
if (isEmptyObj(gsid)) {
return "";
}
return gsid;
}
/**
* sets refid cookie for testing
* @returns void
*/
function mockRefID() {
var _a, _b;
if (window.bactm_envSelector === "notprod") {
var mockRefID_1 = (_b = (_a = new bactm.QueryString(window.location.href)) === null || _a === void 0 ? void 0 : _a._cache) === null || _b === void 0 ? void 0 : _b.mockRefID;
if (mockRefID_1) {
(0,_set_cookie__WEBPACK_IMPORTED_MODULE_3__["default"])({ mockRefID: mockRefID_1 }, {
NAME: "mockRefID",
EXPIRATION: 10,
DOMAIN: ".bankofamerica.com",
SECURE: true,
PATH: "/",
});
}
}
}
function qsLobSetter() {
var sbIndicators = ["customer_lob=sbob", "sbflow=y", "subChannel=SBCLO"];
var consumerIndicators = ["customer_lob=co"];
var gwimUstrustIndicators = [];
var isSBPage = false;
var bactmCookies = new bactm.Cookies();
var sbCookie = bactmCookies.get("isSBCustomer");
if (window.location.href.includes("/secure-authsales-eclo/eclo-results-auth/")) {
isSBPage = sbCookie == "true" ? true : false;
}
var smBusIndicatorsFound = sbIndicators.filter(function (indicator) {
return window.location.search.includes(indicator);
});
var isSmallBusiness = smBusIndicatorsFound.length > 0;
if (isSmallBusiness || isSBPage) {
digitalData.page.attributes.chat.customer_lob = "sbob";
}
}
/**
* Is Universal Header
*
*
* @returns {boolean}
*/
function isUniversalHeader() {
var $universalHeaderModule = document.getElementById("universalHeaderModule");
return document.body.contains($universalHeaderModule);
}
/***/ }),
/***/ "./src/widget/widget-api/agent-incentive.ts":
/*!**************************************************!*\
!*** ./src/widget/widget-api/agent-incentive.ts ***!
\**************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ genesysAgentQualifiedLead; }
/* harmony export */ });
/* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts");
/* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts");
// @ts-nocheck
/** @module widget-api/agent-incentive */
/**
* Genesys Qualified Lead
* @param {string} agentID - encrypted NBKID for the agent
* @desc - Genesys sends an encrypted NBKID once the chat has made a qualified lead.
* This function stores the encrypted ID as a cookie so it can be collected by ABPA once a sale
* has occurred
*
*/
function genesysAgentQualifiedLead(eventName, _a) {
var agentID = _a.agentID;
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, _widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_QUALIFIED_LEAD, { agentID: agentID });
try {
var agentLTS = bactm.Store('chat', { type: 'cookie' });
if ((0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.isMerrill)()) {
agentLTS.clear();
}
// this sets bactm_lts cookie certain sales flow check the bactm_lts cookie rather than the occtChat_lts cookie
agentLTS.set('secureAgentID', agentID);
agentLTS.save();
digitalData.page.attributes.chat.agent_id = agentLTS.get('secureAgentID');
digitalData.page.attributes.chat.sale_occurred = false;
}
catch (e) {
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, 'Genesys Agent Qualified Lead Error', e);
if (bactm && bactm.plugins && bactm.plugins.pixelTag)
bactm.plugins.pixelTag.firePixelTag("".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.PIXEL_TAG_URL, "?error=").concat(e));
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.increaseErrorCount)();
}
}
/***/ }),
/***/ "./src/widget/widget-api/co-browse.ts":
/*!********************************************!*\
!*** ./src/widget/widget-api/co-browse.ts ***!
\********************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
/* harmony export */ });
/* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts");
/* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts");
// @ts-nocheck
/* eslint-disable */
/** @module widget-api/co-browse */
/**
* Co browse
* @param {string} eventName - name of event
* @param {object} configuration
* TODO http://localhost:4000/sparta-demo/chat-widget-demo/undefinedjs/gcb.min.js undefined is envCobrowseURL
* TODO Cobrowse configuration incorrect
*/
/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(eventName, configuration) {
try {
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Genesys Cobrowse Configuration', configuration);
(function (d, s, id, o) {
var _a;
var fs = d.getElementsByTagName(s)[0];
var e;
if (d.getElementById(id))
return;
e = d.createElement(s);
e.id = id;
e.src = o.src;
e.setAttribute('data-gcb-url', o.cbUrl);
(_a = fs.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(e, fs);
}(document, 'script', 'genesys-js', {
src: "".concat(configuration.envCobrowseURL, "js/gcb.min.js"),
cbUrl: configuration.envCobrowseURL
}));
window._genesys = configuration;
TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_COBROWSE_CONFIGURED, configuration);
}
catch (e) {
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, 'Genesys Cobrowse Error', e);
if (bactm && bactm.plugins && bactm.plugins.pixelTag)
bactm.plugins.pixelTag.firePixelTag("".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.PIXEL_TAG_URL, "?error=").concat(e));
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.increaseErrorCount)();
}
}
/***/ }),
/***/ "./src/widget/widget-api/configure-cobrowse.ts":
/*!*****************************************************!*\
!*** ./src/widget/widget-api/configure-cobrowse.ts ***!
\*****************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* binding */ handleConfigureCobrowse; }
/* harmony export */ });
/* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts");
/* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts");
var __assign = (undefined && undefined.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
// @ts-nocheck
/** @module widget-api/configure-cobrowse */
/**
* Handle cobrowse
* @param {object} payload
* @returns {boolean}
*/
function handleConfigureCobrowse(payload) {
var v6 = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.isV6)();
var whichChat = v6 ? 'gt-chat-widget' : 'www-chat';
var widgetVersion = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.whichVersion)();
var currentTLD = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.getCurrentDomain)();
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.publishTealium)(_widget_constants__WEBPACK_IMPORTED_MODULE_1__.GENESYS_COBROWSE_CONFIGURATION, __assign(__assign({}, payload.detail), {
// eslint-disable-next-line max-len
envCobrowseURL: spaWidgetParams[whichChat][widgetVersion].siteParams.domains[currentTLD].cobrowse }));
return false;
}
/***/ }),
/***/ "./src/widget/widget-api/send-disposition-code.ts":
/*!********************************************************!*\
!*** ./src/widget/widget-api/send-disposition-code.ts ***!
\********************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; },
/* harmony export */ failureSendDispositionCode: function() { return /* binding */ failureSendDispositionCode; }
/* harmony export */ });
/* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts");
/* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts");
// @ts-nocheck
/** @module widget-api/send-disposition-code */
/**
* GWE Chat Disposition Response - Failure
* @desc Upon failure, function delivers a Pub/Sub event to send error information back to UI
* @returns {undefined}
*/
function failureSendDispositionCode(dispositionResponse) {
TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GWE_SEND_DISPOSITION_CODE_FAILURE, dispositionResponse);
if (bactm && bactm.plugins && bactm.plugins.pixelTag)
bactm.plugins.pixelTag.firePixelTag("".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.PIXEL_TAG_URL, "?error=").concat(dispositionResponse));
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, 'Survey Response Failure', dispositionResponse);
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.increaseErrorCount)();
return false;
}
/**
* GWE Chat Disposition Response
* @param {string} eventName
* @param {object} payload
* @desc The following method will send the customer response to a proactive chat request
* @returns {undefined}
*/
/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(eventName, payload) {
try {
var result = payload.result, engagementID = payload.engagementID, pageID = payload.pageID, visitID = payload.visitID;
var widgetVersion = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.whichVersion)();
var v6 = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.isV6)();
var whichChat = v6 ? 'gt-chat-widget' : 'www-chat';
var currentTLD = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.getCurrentDomain)();
// eslint-disable-next-line max-len
var inviteURL = spaWidgetParams[whichChat][widgetVersion].siteParams.domains[currentTLD].monitoringjs;
var sendDispositionUrl = "".concat(inviteURL, "/server/data/invites/?result=").concat(result, "&engagementID=").concat(engagementID, "&pageID=").concat(pageID, "&visitID=").concat(visitID);
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Chat Disposition Code', payload);
fetch(sendDispositionUrl, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
credentials: 'include',
});
TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_SUSPEND_MONITORING);
}
catch (error) {
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, 'Genesys Survey Error', error);
failureSendDispositionCode(error);
}
}
/***/ }),
/***/ "./src/widget/widget-constants.ts":
/*!****************************************!*\
!*** ./src/widget/widget-constants.ts ***!
\****************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ ACS_LOGGER_PUBLIC_URL: function() { return /* binding */ ACS_LOGGER_PUBLIC_URL; },
/* harmony export */ ACS_LOGGER_URL: function() { return /* binding */ ACS_LOGGER_URL; },
/* harmony export */ BOFA: function() { return /* binding */ BOFA; },
/* harmony export */ BOFA_DOMAINS: function() { return /* binding */ BOFA_DOMAINS; },
/* harmony export */ BOFA_SALE_INDICATORS: function() { return /* binding */ BOFA_SALE_INDICATORS; },
/* harmony export */ CANCEL_HEARTBEAT: function() { return /* binding */ CANCEL_HEARTBEAT; },
/* harmony export */ CANCEL_SITE_SUBS: function() { return /* binding */ CANCEL_SITE_SUBS; },
/* harmony export */ CANCEL_WIDGET_SUBS: function() { return /* binding */ CANCEL_WIDGET_SUBS; },
/* harmony export */ CHAT_INITIALIZATION: function() { return /* binding */ CHAT_INITIALIZATION; },
/* harmony export */ CHECK_AH_TOKEN: function() { return /* binding */ CHECK_AH_TOKEN; },
/* harmony export */ CHECK_FOR_SALE: function() { return /* binding */ CHECK_FOR_SALE; },
/* harmony export */ COMETD_META_DISCONNECT: function() { return /* binding */ COMETD_META_DISCONNECT; },
/* harmony export */ COOKIE: function() { return /* binding */ COOKIE; },
/* harmony export */ COOKIE_GSID: function() { return /* binding */ COOKIE_GSID; },
/* harmony export */ GENESYS_CHECK_FOR_SALE: function() { return /* binding */ GENESYS_CHECK_FOR_SALE; },
/* harmony export */ GENESYS_COBROWSE_CONFIGURATION: function() { return /* binding */ GENESYS_COBROWSE_CONFIGURATION; },
/* harmony export */ GENESYS_COBROWSE_CONFIGURED: function() { return /* binding */ GENESYS_COBROWSE_CONFIGURED; },
/* harmony export */ GENESYS_FETCH_SESSION_ENDPOINT: function() { return /* binding */ GENESYS_FETCH_SESSION_ENDPOINT; },
/* harmony export */ GENESYS_QUALIFIED_LEAD: function() { return /* binding */ GENESYS_QUALIFIED_LEAD; },
/* harmony export */ GENESYS_REQUEST_FETCH_SESSION: function() { return /* binding */ GENESYS_REQUEST_FETCH_SESSION; },
/* harmony export */ GENESYS_REQUEST_FETCH_SESSION_FAILURE: function() { return /* binding */ GENESYS_REQUEST_FETCH_SESSION_FAILURE; },
/* harmony export */ GENESYS_REQUEST_FETCH_SESSION_SUCCESS: function() { return /* binding */ GENESYS_REQUEST_FETCH_SESSION_SUCCESS; },
/* harmony export */ GENESYS_REQUEST_NATIVE_CHAT: function() { return /* binding */ GENESYS_REQUEST_NATIVE_CHAT; },
/* harmony export */ GENESYS_REQUEST_TC_UPDATE: function() { return /* binding */ GENESYS_REQUEST_TC_UPDATE; },
/* harmony export */ GENESYS_REQUEST_TC_UPDATE_FAILURE: function() { return /* binding */ GENESYS_REQUEST_TC_UPDATE_FAILURE; },
/* harmony export */ GENESYS_REQUEST_TC_UPDATE_SUCCESS: function() { return /* binding */ GENESYS_REQUEST_TC_UPDATE_SUCCESS; },
/* harmony export */ GENESYS_SET_AGENT_ID: function() { return /* binding */ GENESYS_SET_AGENT_ID; },
/* harmony export */ GENESYS_SUSPEND_MONITORING: function() { return /* binding */ GENESYS_SUSPEND_MONITORING; },
/* harmony export */ GENESYS_UPDATE_CHAT_DATA_ENDPOINT: function() { return /* binding */ GENESYS_UPDATE_CHAT_DATA_ENDPOINT; },
/* harmony export */ GENESYS_VALIDATE_IP_ADDRESS_SUCCESS: function() { return /* binding */ GENESYS_VALIDATE_IP_ADDRESS_SUCCESS; },
/* harmony export */ GRAB_HEARTBEAT_DATA: function() { return /* binding */ GRAB_HEARTBEAT_DATA; },
/* harmony export */ GWE_SEND_DISPOSITION_CODE: function() { return /* binding */ GWE_SEND_DISPOSITION_CODE; },
/* harmony export */ GWE_SEND_DISPOSITION_CODE_FAILURE: function() { return /* binding */ GWE_SEND_DISPOSITION_CODE_FAILURE; },
/* harmony export */ GWE_SEND_DISPOSITION_CODE_SUCCESS: function() { return /* binding */ GWE_SEND_DISPOSITION_CODE_SUCCESS; },
/* harmony export */ INIT_CHAT: function() { return /* binding */ INIT_CHAT; },
/* harmony export */ INQ_CLIENT_ORDER_NUM: function() { return /* binding */ INQ_CLIENT_ORDER_NUM; },
/* harmony export */ INTERNAL: function() { return /* binding */ INTERNAL; },
/* harmony export */ IR_ENV: function() { return /* binding */ IR_ENV; },
/* harmony export */ MAX_ERR_RETRIES: function() { return /* binding */ MAX_ERR_RETRIES; },
/* harmony export */ MERRILL: function() { return /* binding */ MERRILL; },
/* harmony export */ ML_SALE_INDICATORS: function() { return /* binding */ ML_SALE_INDICATORS; },
/* harmony export */ MONITORINGJS_HEARTBEAT: function() { return /* binding */ MONITORINGJS_HEARTBEAT; },
/* harmony export */ MONITORINGJS_HEARTBEAT_FAILURE: function() { return /* binding */ MONITORINGJS_HEARTBEAT_FAILURE; },
/* harmony export */ MONITORINGJS_REQUEST: function() { return /* binding */ MONITORINGJS_REQUEST; },
/* harmony export */ MONITORINGJS_RESPONSE: function() { return /* binding */ MONITORINGJS_RESPONSE; },
/* harmony export */ MONITORINGJS_RESPONSE_FAILURE: function() { return /* binding */ MONITORINGJS_RESPONSE_FAILURE; },
/* harmony export */ MONITORING_CLEAR_HEARTBEAT: function() { return /* binding */ MONITORING_CLEAR_HEARTBEAT; },
/* harmony export */ MONITORING_ID_RESPONSE: function() { return /* binding */ MONITORING_ID_RESPONSE; },
/* harmony export */ PIXEL_TAG_URL: function() { return /* binding */ PIXEL_TAG_URL; },
/* harmony export */ PM_SEND_SALE_OCCURRED: function() { return /* binding */ PM_SEND_SALE_OCCURRED; },
/* harmony export */ SEND_PROXY_DATA: function() { return /* binding */ SEND_PROXY_DATA; },
/* harmony export */ SET_MONITORING_STATUS: function() { return /* binding */ SET_MONITORING_STATUS; },
/* harmony export */ SITE_INFO_AVAILABLE: function() { return /* binding */ SITE_INFO_AVAILABLE; },
/* harmony export */ SPARTA: function() { return /* binding */ SPARTA; },
/* harmony export */ SPARTA_WIDGET_READY: function() { return /* binding */ SPARTA_WIDGET_READY; },
/* harmony export */ TEALIUM_READY_FOR_PUBSUB: function() { return /* binding */ TEALIUM_READY_FOR_PUBSUB; },
/* harmony export */ WIDGET_REQUEST_CONFIGURATION: function() { return /* binding */ WIDGET_REQUEST_CONFIGURATION; },
/* harmony export */ WIDGET_REQUEST_CONFIGURATION_ERROR: function() { return /* binding */ WIDGET_REQUEST_CONFIGURATION_ERROR; },
/* harmony export */ WIDGET_REQUEST_CONFIGURATION_SUCCESSFUL: function() { return /* binding */ WIDGET_REQUEST_CONFIGURATION_SUCCESSFUL; },
/* harmony export */ chatSiteParams: function() { return /* binding */ chatSiteParams; },
/* harmony export */ errorLoadingWidget: function() { return /* binding */ errorLoadingWidget; },
/* harmony export */ spartaLoaderLoaded: function() { return /* binding */ spartaLoaderLoaded; }
/* harmony export */ });
// @ts-nocheck
/** @module base/widget-constants */
/**
* Widget constants
* @type {string}
*/
var MONITORINGJS_REQUEST = 'MONITORINGJS_REQUEST';
var MONITORINGJS_HEARTBEAT = 'MONITORINGJS_HEARTBEAT';
var MONITORING_CLEAR_HEARTBEAT = 'MONITORING_CLEAR_HEARTBEAT';
var COMETD_META_DISCONNECT = 'COMETD_META_DISCONNECT';
var PM_SEND_SALE_OCCURRED = 'PM_SEND_SALE_OCCURRED';
var GENESYS_CHECK_FOR_SALE = 'GENESYS_CHECK_FOR_SALE';
var GENESYS_QUALIFIED_LEAD = 'GENESYS_QUALIFIED_LEAD';
/**
* Genesys configurations & request constants
* @type {string}
*/
var GENESYS_COBROWSE_CONFIGURED = 'GENESYS_COBROWSE_CONFIGURED';
var GENESYS_COBROWSE_CONFIGURATION = 'GENESYS_COBROWSE_CONFIGURATION';
/**
* GWE send disposition request, success, & failure constants
* @type {string}
*/
var GWE_SEND_DISPOSITION_CODE = 'GWE_SEND_DISPOSITION_CODE';
var GWE_SEND_DISPOSITION_CODE_SUCCESS = 'GWE_SEND_DISPOSITION_CODE_SUCCESS';
var GWE_SEND_DISPOSITION_CODE_FAILURE = 'GWE_SEND_DISPOSITION_CODE_FAILURE';
/**
* Post Message Constants
* @type {string}
*/
var CANCEL_HEARTBEAT = 'CANCEL_HEARTBEAT';
var CANCEL_WIDGET_SUBS = 'CANCEL_WIDGET_SUBS';
var CANCEL_SITE_SUBS = 'CANCEL_SITE_SUBS';
var CHECK_AH_TOKEN = 'CHECK_AH_TOKEN';
var CHECK_FOR_SALE = 'CHECK_FOR_SALE';
var GRAB_HEARTBEAT_DATA = 'GRAB_HEARTBEAT_DATA';
var SET_MONITORING_STATUS = 'SET_MONITORING_STATUS';
var SEND_PROXY_DATA = 'SEND_PROXY_DATA';
var MAX_ERR_RETRIES = 3;
/**
* response failures constants
* @type {string}
*/
var MONITORINGJS_RESPONSE_FAILURE = 'MONITORINGJS_RESPONSE_FAILURE';
var MONITORINGJS_HEARTBEAT_FAILURE = 'MONITORINGJS_HEARTBEAT_FAILURE';
/**
* response success constants
* @type {string}
*/
var MONITORINGJS_RESPONSE = 'MONITORINGJS_RESPONSE';
var MONITORING_ID_RESPONSE = 'MONITORING_ID_RESPONSE';
/**
* chat & widget constants
* @type {string}
*/
var spartaLoaderLoaded = 'spartaLoaderLoaded';
var errorLoadingWidget = 'errorLoadingWidget';
var CHAT_INITIALIZATION = 'CHAT_INITIALIZATION';
var WIDGET_REQUEST_CONFIGURATION = 'WIDGET_REQUEST_CONFIGURATION';
var SPARTA_WIDGET_READY = 'SPARTA_WIDGET_READY.spartaWidgetUtility';
var WIDGET_REQUEST_CONFIGURATION_ERROR = 'WIDGET_REQUEST_CONFIGURATION_ERROR';
var WIDGET_REQUEST_CONFIGURATION_SUCCESSFUL = 'WIDGET_REQUEST_CONFIGURATION_SUCCESSFUL';
/**
* genesys fetch session constants
* this is specific to chat ACS and will only be used inside mweb
* @type {string}
*/
var GENESYS_REQUEST_FETCH_SESSION = 'GENESYS_REQUEST_FETCH_SESSION';
var GENESYS_REQUEST_FETCH_SESSION_SUCCESS = 'GENESYS_REQUEST_FETCH_SESSION_SUCCESS';
var GENESYS_REQUEST_FETCH_SESSION_FAILURE = 'GENESYS_REQUEST_FETCH_SESSION_FAILURE';
var GENESYS_UPDATE_CHAT_DATA_ENDPOINT = '1/service/UpdateChatData';
var GENESYS_FETCH_SESSION_ENDPOINT = '1/service/GetRefIDInfo/';
var SITE_INFO_AVAILABLE = 'SITE_INFO_AVAILABLE';
var TEALIUM_READY_FOR_PUBSUB = 'TEALIUM_READY_FOR_PUBSUB';
/**
* genesys native chat event
* @type {string}
*/
var GENESYS_REQUEST_NATIVE_CHAT = 'GENESYS_REQUEST_NATIVE_CHAT';
var GENESYS_VALIDATE_IP_ADDRESS_SUCCESS = 'GENESYS_VALIDATE_IP_ADDRESS_SUCCESS';
var GENESYS_SET_AGENT_ID = 'GENESYS_SET_AGENT_ID';
/**
* genesys request terms and conditions update event
* @type {string}
*/
var GENESYS_REQUEST_TC_UPDATE = 'GENESYS_REQUEST_TC_UPDATE';
var GENESYS_REQUEST_TC_UPDATE_SUCCESS = 'GENESYS_REQUEST_TC_UPDATE_SUCCESS';
var GENESYS_REQUEST_TC_UPDATE_FAILURE = 'GENESYS_REQUEST_TC_UPDATE_FAILURE';
var chatSiteParams = {
spaParams: undefined
};
/**
* Pixel Tag URL for Error Logging
* @type {string}
*/
var PIXEL_TAG_URL = 'https://www.bankofamerica.com/pa/global-assets/1.0/graphic/clr.gif';
/**
* Mobile ACS Logger Service
* @type {string}
*/
var ACS_LOGGER_URL = '/mgateway/v1/clientLogger/log';
var ACS_LOGGER_PUBLIC_URL = '/mgateway/public/v1/clientLogger/log';
/**
* Init Chat Constant
* @type {string}
*/
var INIT_CHAT = 'INIT_CHAT';
/**
* Suspend Heartbeat Constant
* @type {string}
*/
var GENESYS_SUSPEND_MONITORING = 'GENESYS_SUSPEND_MONITORING';
/**
* Release and Environmental Constants
* @type {array}
* @type {string}
*/
var MERRILL = 'MERRILL';
var INTERNAL = 'INTERNAL';
var BOFA = 'BOFA';
var SPARTA = 'SPARTA';
var BOFA_DOMAINS = [
'dev1.',
'dev2.,',
'dev3.',
'dev4.',
'devflex.',
'devps.',
'qa5.',
'qaps.',
'cert1.',
'cert2.',
'pt1.',
'pt2.',
'preview1.',
'preview2.',
'review1.',
'review2.',
'dev1-helix.',
'dev2-helix.',
'dev3-helix.',
'dev4-helix.',
'devflex1-helix.',
'pt1-helix.',
'pt2-helix.',
'pssit-helix.',
'preview1-helix.',
'preview2-helix.',
'review1-helix.',
'review2-helix.',
'sit1a-helix.',
'sit2a-helix.',
'sit3-helix.',
'sitbc-helix.',
];
var IR_ENV = {
DEV: 'dev4',
CERT: 'sit1a',
};
/**
* Sale Indicators Constants Array
* @type {array}
*/
var ML_SALE_INDICATORS = [
'inqClientOrderNum',
'MLD_OAO_CONFIRMATIONNUMBER',
'MLD_OAO_ACCOUNTNUMBER',
];
var BOFA_SALE_INDICATORS = [
'applicationID',
];
var INQ_CLIENT_ORDER_NUM = 'inqClientOrderNum';
var COOKIE = {
NAME: 'occtChat',
EXPIRATION: 10,
DOMAIN: '.bankofamerica.com',
SECURE: true,
PATH: '/',
};
/**
* GSID Cookie
*/
var COOKIE_GSID = {
NAME: 'GSID',
DOMAIN: '.bankofamerica.com',
SECURE: true,
PATH: '/',
};
/***/ }),
/***/ "./node_modules/whatwg-fetch/fetch.js":
/*!********************************************!*\
!*** ./node_modules/whatwg-fetch/fetch.js ***!
\********************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ DOMException: function() { return /* binding */ DOMException; },
/* harmony export */ Headers: function() { return /* binding */ Headers; },
/* harmony export */ Request: function() { return /* binding */ Request; },
/* harmony export */ Response: function() { return /* binding */ Response; },
/* harmony export */ fetch: function() { return /* binding */ fetch; }
/* harmony export */ });
/* eslint-disable no-prototype-builtins */
var g =
(typeof globalThis !== 'undefined' && globalThis) ||
(typeof self !== 'undefined' && self) ||
// eslint-disable-next-line no-undef
(typeof __webpack_require__.g !== 'undefined' && __webpack_require__.g) ||
{}
var support = {
searchParams: 'URLSearchParams' in g,
iterable: 'Symbol' in g && 'iterator' in Symbol,
blob:
'FileReader' in g &&
'Blob' in g &&
(function() {
try {
new Blob()
return true
} catch (e) {
return false
}
})(),
formData: 'FormData' in g,
arrayBuffer: 'ArrayBuffer' in g
}
function isDataView(obj) {
return obj && DataView.prototype.isPrototypeOf(obj)
}
if (support.arrayBuffer) {
var viewClasses = [
'[object Int8Array]',
'[object Uint8Array]',
'[object Uint8ClampedArray]',
'[object Int16Array]',
'[object Uint16Array]',
'[object Int32Array]',
'[object Uint32Array]',
'[object Float32Array]',
'[object Float64Array]'
]
var isArrayBufferView =
ArrayBuffer.isView ||
function(obj) {
return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
}
}
function normalizeName(name) {
if (typeof name !== 'string') {
name = String(name)
}
if (/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(name) || name === '') {
throw new TypeError('Invalid character in header field name: "' + name + '"')
}
return name.toLowerCase()
}
function normalizeValue(value) {
if (typeof value !== 'string') {
value = String(value)
}
return value
}
// Build a destructive iterator for the value list
function iteratorFor(items) {
var iterator = {
next: function() {
var value = items.shift()
return {done: value === undefined, value: value}
}
}
if (support.iterable) {
iterator[Symbol.iterator] = function() {
return iterator
}
}
return iterator
}
function Headers(headers) {
this.map = {}
if (headers instanceof Headers) {
headers.forEach(function(value, name) {
this.append(name, value)
}, this)
} else if (Array.isArray(headers)) {
headers.forEach(function(header) {
if (header.length != 2) {
throw new TypeError('Headers constructor: expected name/value pair to be length 2, found' + header.length)
}
this.append(header[0], header[1])
}, this)
} else if (headers) {
Object.getOwnPropertyNames(headers).forEach(function(name) {
this.append(name, headers[name])
}, this)
}
}
Headers.prototype.append = function(name, value) {
name = normalizeName(name)
value = normalizeValue(value)
var oldValue = this.map[name]
this.map[name] = oldValue ? oldValue + ', ' + value : value
}
Headers.prototype['delete'] = function(name) {
delete this.map[normalizeName(name)]
}
Headers.prototype.get = function(name) {
name = normalizeName(name)
return this.has(name) ? this.map[name] : null
}
Headers.prototype.has = function(name) {
return this.map.hasOwnProperty(normalizeName(name))
}
Headers.prototype.set = function(name, value) {
this.map[normalizeName(name)] = normalizeValue(value)
}
Headers.prototype.forEach = function(callback, thisArg) {
for (var name in this.map) {
if (this.map.hasOwnProperty(name)) {
callback.call(thisArg, this.map[name], name, this)
}
}
}
Headers.prototype.keys = function() {
var items = []
this.forEach(function(value, name) {
items.push(name)
})
return iteratorFor(items)
}
Headers.prototype.values = function() {
var items = []
this.forEach(function(value) {
items.push(value)
})
return iteratorFor(items)
}
Headers.prototype.entries = function() {
var items = []
this.forEach(function(value, name) {
items.push([name, value])
})
return iteratorFor(items)
}
if (support.iterable) {
Headers.prototype[Symbol.iterator] = Headers.prototype.entries
}
function consumed(body) {
if (body._noBody) return
if (body.bodyUsed) {
return Promise.reject(new TypeError('Already read'))
}
body.bodyUsed = true
}
function fileReaderReady(reader) {
return new Promise(function(resolve, reject) {
reader.onload = function() {
resolve(reader.result)
}
reader.onerror = function() {
reject(reader.error)
}
})
}
function readBlobAsArrayBuffer(blob) {
var reader = new FileReader()
var promise = fileReaderReady(reader)
reader.readAsArrayBuffer(blob)
return promise
}
function readBlobAsText(blob) {
var reader = new FileReader()
var promise = fileReaderReady(reader)
var match = /charset=([A-Za-z0-9_-]+)/.exec(blob.type)
var encoding = match ? match[1] : 'utf-8'
reader.readAsText(blob, encoding)
return promise
}
function readArrayBufferAsText(buf) {
var view = new Uint8Array(buf)
var chars = new Array(view.length)
for (var i = 0; i < view.length; i++) {
chars[i] = String.fromCharCode(view[i])
}
return chars.join('')
}
function bufferClone(buf) {
if (buf.slice) {
return buf.slice(0)
} else {
var view = new Uint8Array(buf.byteLength)
view.set(new Uint8Array(buf))
return view.buffer
}
}
function Body() {
this.bodyUsed = false
this._initBody = function(body) {
/*
fetch-mock wraps the Response object in an ES6 Proxy to
provide useful test harness features such as flush. However, on
ES5 browsers without fetch or Proxy support pollyfills must be used;
the proxy-pollyfill is unable to proxy an attribute unless it exists
on the object before the Proxy is created. This change ensures
Response.bodyUsed exists on the instance, while maintaining the
semantic of setting Request.bodyUsed in the constructor before
_initBody is called.
*/
// eslint-disable-next-line no-self-assign
this.bodyUsed = this.bodyUsed
this._bodyInit = body
if (!body) {
this._noBody = true;
this._bodyText = ''
} else if (typeof body === 'string') {
this._bodyText = body
} else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
this._bodyBlob = body
} else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
this._bodyFormData = body
} else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
this._bodyText = body.toString()
} else if (support.arrayBuffer && support.blob && isDataView(body)) {
this._bodyArrayBuffer = bufferClone(body.buffer)
// IE 10-11 can't handle a DataView body.
this._bodyInit = new Blob([this._bodyArrayBuffer])
} else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
this._bodyArrayBuffer = bufferClone(body)
} else {
this._bodyText = body = Object.prototype.toString.call(body)
}
if (!this.headers.get('content-type')) {
if (typeof body === 'string') {
this.headers.set('content-type', 'text/plain;charset=UTF-8')
} else if (this._bodyBlob && this._bodyBlob.type) {
this.headers.set('content-type', this._bodyBlob.type)
} else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')
}
}
}
if (support.blob) {
this.blob = function() {
var rejected = consumed(this)
if (rejected) {
return rejected
}
if (this._bodyBlob) {
return Promise.resolve(this._bodyBlob)
} else if (this._bodyArrayBuffer) {
return Promise.resolve(new Blob([this._bodyArrayBuffer]))
} else if (this._bodyFormData) {
throw new Error('could not read FormData body as blob')
} else {
return Promise.resolve(new Blob([this._bodyText]))
}
}
}
this.arrayBuffer = function() {
if (this._bodyArrayBuffer) {
var isConsumed = consumed(this)
if (isConsumed) {
return isConsumed
} else if (ArrayBuffer.isView(this._bodyArrayBuffer)) {
return Promise.resolve(
this._bodyArrayBuffer.buffer.slice(
this._bodyArrayBuffer.byteOffset,
this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength
)
)
} else {
return Promise.resolve(this._bodyArrayBuffer)
}
} else if (support.blob) {
return this.blob().then(readBlobAsArrayBuffer)
} else {
throw new Error('could not read as ArrayBuffer')
}
}
this.text = function() {
var rejected = consumed(this)
if (rejected) {
return rejected
}
if (this._bodyBlob) {
return readBlobAsText(this._bodyBlob)
} else if (this._bodyArrayBuffer) {
return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))
} else if (this._bodyFormData) {
throw new Error('could not read FormData body as text')
} else {
return Promise.resolve(this._bodyText)
}
}
if (support.formData) {
this.formData = function() {
return this.text().then(decode)
}
}
this.json = function() {
return this.text().then(JSON.parse)
}
return this
}
// HTTP methods whose capitalization should be normalized
var methods = ['CONNECT', 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'TRACE']
function normalizeMethod(method) {
var upcased = method.toUpperCase()
return methods.indexOf(upcased) > -1 ? upcased : method
}
function Request(input, options) {
if (!(this instanceof Request)) {
throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.')
}
options = options || {}
var body = options.body
if (input instanceof Request) {
if (input.bodyUsed) {
throw new TypeError('Already read')
}
this.url = input.url
this.credentials = input.credentials
if (!options.headers) {
this.headers = new Headers(input.headers)
}
this.method = input.method
this.mode = input.mode
this.signal = input.signal
if (!body && input._bodyInit != null) {
body = input._bodyInit
input.bodyUsed = true
}
} else {
this.url = String(input)
}
this.credentials = options.credentials || this.credentials || 'same-origin'
if (options.headers || !this.headers) {
this.headers = new Headers(options.headers)
}
this.method = normalizeMethod(options.method || this.method || 'GET')
this.mode = options.mode || this.mode || null
this.signal = options.signal || this.signal || (function () {
if ('AbortController' in g) {
var ctrl = new AbortController();
return ctrl.signal;
}
}());
this.referrer = null
if ((this.method === 'GET' || this.method === 'HEAD') && body) {
throw new TypeError('Body not allowed for GET or HEAD requests')
}
this._initBody(body)
if (this.method === 'GET' || this.method === 'HEAD') {
if (options.cache === 'no-store' || options.cache === 'no-cache') {
// Search for a '_' parameter in the query string
var reParamSearch = /([?&])_=[^&]*/
if (reParamSearch.test(this.url)) {
// If it already exists then set the value with the current time
this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime())
} else {
// Otherwise add a new '_' parameter to the end with the current time
var reQueryString = /\?/
this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime()
}
}
}
}
Request.prototype.clone = function() {
return new Request(this, {body: this._bodyInit})
}
function decode(body) {
var form = new FormData()
body
.trim()
.split('&')
.forEach(function(bytes) {
if (bytes) {
var split = bytes.split('=')
var name = split.shift().replace(/\+/g, ' ')
var value = split.join('=').replace(/\+/g, ' ')
form.append(decodeURIComponent(name), decodeURIComponent(value))
}
})
return form
}
function parseHeaders(rawHeaders) {
var headers = new Headers()
// Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space
// https://tools.ietf.org/html/rfc7230#section-3.2
var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' ')
// Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill
// https://github.com/github/fetch/issues/748
// https://github.com/zloirock/core-js/issues/751
preProcessedHeaders
.split('\r')
.map(function(header) {
return header.indexOf('\n') === 0 ? header.substr(1, header.length) : header
})
.forEach(function(line) {
var parts = line.split(':')
var key = parts.shift().trim()
if (key) {
var value = parts.join(':').trim()
try {
headers.append(key, value)
} catch (error) {
console.warn('Response ' + error.message)
}
}
})
return headers
}
Body.call(Request.prototype)
function Response(bodyInit, options) {
if (!(this instanceof Response)) {
throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.')
}
if (!options) {
options = {}
}
this.type = 'default'
this.status = options.status === undefined ? 200 : options.status
if (this.status < 200 || this.status > 599) {
throw new RangeError("Failed to construct 'Response': The status provided (0) is outside the range [200, 599].")
}
this.ok = this.status >= 200 && this.status < 300
this.statusText = options.statusText === undefined ? '' : '' + options.statusText
this.headers = new Headers(options.headers)
this.url = options.url || ''
this._initBody(bodyInit)
}
Body.call(Response.prototype)
Response.prototype.clone = function() {
return new Response(this._bodyInit, {
status: this.status,
statusText: this.statusText,
headers: new Headers(this.headers),
url: this.url
})
}
Response.error = function() {
var response = new Response(null, {status: 200, statusText: ''})
response.ok = false
response.status = 0
response.type = 'error'
return response
}
var redirectStatuses = [301, 302, 303, 307, 308]
Response.redirect = function(url, status) {
if (redirectStatuses.indexOf(status) === -1) {
throw new RangeError('Invalid status code')
}
return new Response(null, {status: status, headers: {location: url}})
}
var DOMException = g.DOMException
try {
new DOMException()
} catch (err) {
DOMException = function(message, name) {
this.message = message
this.name = name
var error = Error(message)
this.stack = error.stack
}
DOMException.prototype = Object.create(Error.prototype)
DOMException.prototype.constructor = DOMException
}
function fetch(input, init) {
return new Promise(function(resolve, reject) {
var request = new Request(input, init)
if (request.signal && request.signal.aborted) {
return reject(new DOMException('Aborted', 'AbortError'))
}
var xhr = new XMLHttpRequest()
function abortXhr() {
xhr.abort()
}
xhr.onload = function() {
var options = {
statusText: xhr.statusText,
headers: parseHeaders(xhr.getAllResponseHeaders() || '')
}
// This check if specifically for when a user fetches a file locally from the file system
// Only if the status is out of a normal range
if (request.url.indexOf('file://') === 0 && (xhr.status < 200 || xhr.status > 599)) {
options.status = 200;
} else {
options.status = xhr.status;
}
options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')
var body = 'response' in xhr ? xhr.response : xhr.responseText
setTimeout(function() {
resolve(new Response(body, options))
}, 0)
}
xhr.onerror = function() {
setTimeout(function() {
reject(new TypeError('Network request failed'))
}, 0)
}
xhr.ontimeout = function() {
setTimeout(function() {
reject(new TypeError('Network request timed out'))
}, 0)
}
xhr.onabort = function() {
setTimeout(function() {
reject(new DOMException('Aborted', 'AbortError'))
}, 0)
}
function fixUrl(url) {
try {
return url === '' && g.location.href ? g.location.href : url
} catch (e) {
return url
}
}
xhr.open(request.method, fixUrl(request.url), true)
if (request.credentials === 'include') {
xhr.withCredentials = true
} else if (request.credentials === 'omit') {
xhr.withCredentials = false
}
if ('responseType' in xhr) {
if (support.blob) {
xhr.responseType = 'blob'
} else if (
support.arrayBuffer
) {
xhr.responseType = 'arraybuffer'
}
}
if (init && typeof init.headers === 'object' && !(init.headers instanceof Headers || (g.Headers && init.headers instanceof g.Headers))) {
var names = [];
Object.getOwnPropertyNames(init.headers).forEach(function(name) {
names.push(normalizeName(name))
xhr.setRequestHeader(name, normalizeValue(init.headers[name]))
})
request.headers.forEach(function(value, name) {
if (names.indexOf(name) === -1) {
xhr.setRequestHeader(name, value)
}
})
} else {
request.headers.forEach(function(value, name) {
xhr.setRequestHeader(name, value)
})
}
if (request.signal) {
request.signal.addEventListener('abort', abortXhr)
xhr.onreadystatechange = function() {
// DONE (success or failure)
if (xhr.readyState === 4) {
request.signal.removeEventListener('abort', abortXhr)
}
}
}
xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)
})
}
fetch.polyfill = true
if (!g.fetch) {
g.fetch = fetch
g.Headers = Headers
g.Request = Request
g.Response = Response
}
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/define property getters */
/******/ !function() {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = function(exports, definition) {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ }();
/******/
/******/ /* webpack/runtime/global */
/******/ !function() {
/******/ __webpack_require__.g = (function() {
/******/ if (typeof globalThis === 'object') return globalThis;
/******/ try {
/******/ return this || new Function('return this')();
/******/ } catch (e) {
/******/ if (typeof window === 'object') return window;
/******/ }
/******/ })();
/******/ }();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ !function() {
/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
/******/ }();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ !function() {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ }();
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
!function() {
/*!*****************************!*\
!*** ./src/widget/index.ts ***!
\*****************************/
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var whatwg_fetch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! whatwg-fetch */ "./node_modules/whatwg-fetch/fetch.js");
/* harmony import */ var _pubsub_bootstrap__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pubsub/bootstrap */ "./src/widget/pubsub/bootstrap.ts");
/* harmony import */ var _pubsub_post_messages__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./pubsub/post-messages */ "./src/widget/pubsub/post-messages.ts");
/* harmony import */ var _pubsub_placeholder__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./pubsub/placeholder */ "./src/widget/pubsub/placeholder.ts");
/* harmony import */ var _pubsub_widget_script__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pubsub/widget-script */ "./src/widget/pubsub/widget-script.ts");
/* harmony import */ var _sales_genesys_data__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./sales/genesys-data */ "./src/widget/sales/genesys-data.ts");
/* harmony import */ var _pubsub_widget_script_loaded__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./pubsub/widget-script-loaded */ "./src/widget/pubsub/widget-script-loaded.ts");
/* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utilities/utilities */ "./src/widget/utilities/utilities.ts");
/* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./widget-constants */ "./src/widget/widget-constants.ts");
//@ts-nocheck
/**
* Load Chat Widget
*
*
* This function loads chat widget, but also does several other things:
*
* - Genesys Data is populated
* - Chat Placeholder is added
* - Widget Script & Polyfill added
* - Mock Ref ID Use Case
* - Proxy Chat DDO
* - Secure Agents
* @returns {void}
*/
var loadChatWidget = function () {
(0,_sales_genesys_data__WEBPACK_IMPORTED_MODULE_5__["default"])();
(0,_pubsub_placeholder__WEBPACK_IMPORTED_MODULE_3__["default"])();
// Is V6
var v6 = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_7__.isV6)();
(0,_pubsub_widget_script__WEBPACK_IMPORTED_MODULE_4__["default"])();
if (v6) {
window.sparta.chat = {};
window.sparta.chat.widgetLoader = window.sparta.widgetLoader["6.0.9"];
window.sparta.chat.widgetLoader.sub = function (message, func) { };
window.sparta.chat.widgetLoader.pub = function (message, data) { };
}
// none of this code being ran
(0,_pubsub_widget_script_loaded__WEBPACK_IMPORTED_MODULE_6__["default"])();
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_7__.mockRefID)();
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_7__.proxyChatDDO)(window.digitalData.page.attributes.chat, "site_id");
if (typeof bactm !== "undefined") {
var agentLTS = bactm.Store("chat", { type: "cookie" });
if (agentLTS.get("secureAgentID")) {
var agentID = agentLTS.get("secureAgentID");
digitalData.page.attributes.chat.agent_id = agentID;
}
(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_7__.qsLobSetter)();
bactm.ddo.set("page.attributes.chat.mobileIndicator", (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_7__.checkWrap)());
}
};
/**
* Authenticated Listener
*
*
* Griffins Universal Header will dispatch event to notify
* Chat if user is youth or not
* @returns {void}
*/
var authenticatedListener = function () {
document.addEventListener("digitalData.auth.ready", function () {
var _a = verifyYouthProfile(), youthPropExist = _a.youthPropExist, youthProp = _a.youthProp;
if (youthPropExist) {
if (!youthProp) {
loadChatWidget();
return;
}
if (youthProp)
return;
}
}, true);
};
/**
* Single Page Application Listener
*
*
* Listener for bactm.on('afterPageview')
* @returns {void}
*/
var singlePageApplicationListener = function () {
try {
// Ensure bactm has the correct type or cast it to a type that includes 'on'
bactm === null || bactm === void 0 ? void 0 : bactm.on("afterPageview", onBactmPageView);
}
catch (e) {
console.log(e);
}
};
/**
* On Bactm Page View
*
*
* Callback for when bactm.pageview is triggered
*/
var onBactmPageView = function (data) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
var chatDisabled = (_b = (_a = data === null || data === void 0 ? void 0 : data.pageInfo) === null || _a === void 0 ? void 0 : _a.chat) === null || _b === void 0 ? void 0 : _b.disabled;
var siteID = (_d = (_c = data === null || data === void 0 ? void 0 : data.pageInfo) === null || _c === void 0 ? void 0 : _c.chat) === null || _d === void 0 ? void 0 : _d.site_id;
var servicesLivePersonEnabled = (_h = (_g = (_f = (_e = window === null || window === void 0 ? void 0 : window.digitalData) === null || _e === void 0 ? void 0 : _e.page) === null || _f === void 0 ? void 0 : _f.attributes) === null || _g === void 0 ? void 0 : _g.chat) === null || _h === void 0 ? void 0 : _h.servicesLivePersonEnabled;
var bactmCookies = new bactm.Cookies();
var cookieExists = bactmCookies.get("occtChat");
var occtChatCookie = cookieExists ? JSON.parse(cookieExists) : "";
var isChatOngoing = (occtChatCookie === null || occtChatCookie === void 0 ? void 0 : occtChatCookie.secureKey) && occtChatCookie.secureKey !== "";
if (servicesLivePersonEnabled === "NO" && !isChatOngoing)
return false;
if (chatDisabled)
setChatSite({ siteID: false });
if (siteID)
setChatSite({ siteID: siteID });
(_k = (_j = window === null || window === void 0 ? void 0 : window.boa) === null || _j === void 0 ? void 0 : _j.chat) === null || _k === void 0 ? void 0 : _k.reload();
};
/**
* Set Chat Site ID
*
*
* Set SITE_ID & site_id inside of DDO
* @param {boolean|string} siteID
* @returns {void}
*/
var setChatSite = function (_a) {
var _b, _c, _d;
var _e = _a.siteID, siteID = _e === void 0 ? false : _e;
try {
var chatAttributes = window.digitalData.page.attributes.chat;
chatAttributes.site_id = siteID;
chatAttributes.SITE_ID = siteID;
window.chatSpaReady = true;
(_d = (_c = (_b = window === null || window === void 0 ? void 0 : window.sparta) === null || _b === void 0 ? void 0 : _b.chat) === null || _c === void 0 ? void 0 : _c.widgetLoader) === null || _d === void 0 ? void 0 : _d.pub("startChatSPA", { siteID: siteID });
}
catch (e) {
console.log(e);
}
};
/**
* Verify Youth Profile
*
*
* Family Banking Project - Check if youth property exist
* @returns {object}
*/
var verifyYouthProfile = function () {
var _a;
var user = (_a = window === null || window === void 0 ? void 0 : window.digitalData) === null || _a === void 0 ? void 0 : _a.user;
var youthPropExist = user === null || user === void 0 ? void 0 : user.hasOwnProperty("youth");
var youthProp = (user === null || user === void 0 ? void 0 : user.youth) === "true" || (user === null || user === void 0 ? void 0 : user.youth) === true;
return { youthProp: youthProp, youthPropExist: youthPropExist };
};
/**
* Start Single Page Application
*
*
* Start a Single Page Application if isSpa is pouplated
* boolean true
* @returns {void}
*/
var startSinglePageApplication = function () {
var _a, _b;
var delayedChat = { fired: false };
var pageViews = Array.isArray(window === null || window === void 0 ? void 0 : window.dataCollector)
? window.dataCollector.filter(function (_a) {
var event = _a.event;
return event === "pageview";
})
: [];
if (pageViews.length === 0) {
window.addEventListener("gt.showChat.ready", function (e) {
if (delayedChat.fired)
return;
singlePageApplicationListener();
delayedChat.fired = true;
});
return;
}
var pageView = pageViews[pageViews.length - 1];
var payload = {
pageInfo: (_b = (_a = digitalData === null || digitalData === void 0 ? void 0 : digitalData.page) === null || _a === void 0 ? void 0 : _a.pageInfo) === null || _b === void 0 ? void 0 : _b[pageView.pageInfoKey],
};
onBactmPageView(payload);
singlePageApplicationListener();
};
/**
* Start Chat Platform
*
*
* Beginning of Chat Platform. First line of code.
* @returns {void}
*/
var startChatPlatform = function () {
var _a, _b, _c, _d, _e, _f, _g, _h;
var isAuthenticated = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_7__.isUniversalHeader)();
var disableChat = window.digitalData && window.digitalData.disableChatOnLoad === true;
if (disableChat) {
TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_8__.INIT_CHAT, function () { });
return false;
}
if (!isAuthenticated) {
loadChatWidget();
if ((_d = (_c = (_b = (_a = window === null || window === void 0 ? void 0 : window.digitalData) === null || _a === void 0 ? void 0 : _a.page) === null || _b === void 0 ? void 0 : _b.attributes) === null || _c === void 0 ? void 0 : _c.chat) === null || _d === void 0 ? void 0 : _d.isSpa) {
startSinglePageApplication();
}
return false;
}
if ((_h = (_g = (_f = (_e = window === null || window === void 0 ? void 0 : window.digitalData) === null || _e === void 0 ? void 0 : _e.page) === null || _f === void 0 ? void 0 : _f.attributes) === null || _g === void 0 ? void 0 : _g.chat) === null || _h === void 0 ? void 0 : _h.isSpa) {
loadChatWidget();
startSinglePageApplication();
return false;
}
var _j = verifyYouthProfile(), youthPropExist = _j.youthPropExist, youthProp = _j.youthProp;
if (youthPropExist) {
if (!youthProp) {
loadChatWidget();
return;
}
if (youthProp)
return;
}
authenticatedListener();
};
(function () { return startChatPlatform(); })();
}();
/******/ })()
;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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S0FBSztBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JELFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUiw0RUFBNEU7QUFDNUU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCLHFCQUFxQjtBQUNqRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUVELHFCQUFxQixFQUFFLENBQUM7QUFDMUIsQ0FBQyxDQUFDO0FBRUYsQ0FBQyxjQUFNLHdCQUFpQixFQUFFLEVBQW5CLENBQW1CLENBQUMsRUFBRSxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY2hhdC8uL3NyYy93aWRnZXQvdXRpbGl0aWVzL2xvZ2dlci5qcyIsIndlYnBhY2s6Ly9jaGF0Ly4vc3JjL3dpZGdldC9ldmVudHMudHMiLCJ3ZWJwYWNrOi8vY2hhdC8uL3NyYy93aWRnZXQvcHVic3ViL2FkZC1wdWItc3ViLnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3B1YnN1Yi9ib290c3RyYXAudHMiLCJ3ZWJwYWNrOi8vY2hhdC8uL3NyYy93aWRnZXQvcHVic3ViL3BsYWNlaG9sZGVyLnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3B1YnN1Yi9wb3N0LW1lc3NhZ2VzLnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3B1YnN1Yi9wdWItc3ViLnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3B1YnN1Yi9zdWJzY3JpcHRpb25zLnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3B1YnN1Yi93aWRnZXQtc2NyaXB0LWxvYWRlZC50cyIsIndlYnBhY2s6Ly9jaGF0Ly4vc3JjL3dpZGdldC9wdWJzdWIvd2lkZ2V0LXNjcmlwdC50cyIsIndlYnBhY2s6Ly9jaGF0Ly4vc3JjL3dpZGdldC9zYWxlcy9mZXRjaC1yZWZJRC50cyIsIndlYnBhY2s6Ly9jaGF0Ly4vc3JjL3dpZGdldC9zYWxlcy9nZW5lc3lzLWRhdGEudHMiLCJ3ZWJwYWNrOi8vY2hhdC8uL3NyYy93aWRnZXQvc2FsZXMvZ3JhYi1kYXRhLnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3NhbGVzL2hlYXJ0YmVhdC50cyIsIndlYnBhY2s6Ly9jaGF0Ly4vc3JjL3dpZGdldC9zYWxlcy9yZXF1ZXN0LXRjLXVwZGF0ZS50cyIsIndlYnBhY2s6Ly9jaGF0Ly4vc3JjL3dpZGdldC9zYWxlcy9yZXF1ZXN0LnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3NhbGVzL3Jlc3BvbnNlLnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3V0aWxpdGllcy9mZXRjaC13aXRoLXJldHJ5LnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3V0aWxpdGllcy9nZXQtY29va2llLnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3V0aWxpdGllcy9zZXQtY29va2llLnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3V0aWxpdGllcy91dGlsaXRpZXMudHMiLCJ3ZWJwYWNrOi8vY2hhdC8uL3NyYy93aWRnZXQvd2lkZ2V0LWFwaS9hZ2VudC1pbmNlbnRpdmUudHMiLCJ3ZWJwYWNrOi8vY2hhdC8uL3NyYy93aWRnZXQvd2lkZ2V0LWFwaS9jby1icm93c2UudHMiLCJ3ZWJwYWNrOi8vY2hhdC8uL3NyYy93aWRnZXQvd2lkZ2V0LWFwaS9jb25maWd1cmUtY29icm93c2UudHMiLCJ3ZWJwYWNrOi8vY2hhdC8uL3NyYy93aWRnZXQvd2lkZ2V0LWFwaS9zZW5kLWRpc3Bvc2l0aW9uLWNvZGUudHMiLCJ3ZWJwYWNrOi8vY2hhdC8uL3NyYy93aWRnZXQvd2lkZ2V0LWNvbnN0YW50cy50cyIsIndlYnBhY2s6Ly9jaGF0Ly4vbm9kZV9tb2R1bGVzL3doYXR3Zy1mZXRjaC9mZXRjaC5qcyIsIndlYnBhY2s6Ly9jaGF0L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2NoYXQvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2NoYXQvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9jaGF0L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vY2hhdC93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1ub2NoZWNrXG5cbmltcG9ydCB7IEFDU19MT0dHRVJfVVJMIH0gZnJvbSBcIi4uL3dpZGdldC1jb25zdGFudHNcIjtcbmltcG9ydCB7IGxvZ0dlbmVzeXNFdmVudCB9IGZyb20gXCIuL3V0aWxpdGllc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtb2JpbGVBQ1NMb2dnZXJTZXJ2aWNlKGxhYmVsLCBlcnJvcikge1xuICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJ3NlY3VyZScpKSB7XG4gICAgaWYgKCF3aW5kb3cuYmFjdG1fZW52U2VsZWN0b3IpIHJldHVybjtcbiAgbG9nR2VuZXN5c0V2ZW50KDEsICdDbGllbnQgTG9nZ2VyIGZpcmVkJywgZXJyb3IpXG4gICAgY29uc3QgZXJyb3JQYXlsb2FkID0ge1xuICAgICAgXCJwYXlsb2FkXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibG9nTGV2ZWxcIjogXCJkZWJ1Z1wiLFxuICAgICAgICAgIFwiZW50cnlcIjogYGxhYmVsOiAke2xhYmVsfSB8IGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCAgICAgICAgICBcbiAgICAgICAgfSxcbiAgICAgIF1cbiAgICB9XG4gICAgY29uc3QgZG9tYWluID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbi5yZXBsYWNlKCdzZWN1cmUnLCAnbXNlcnZpY2UnKVxuICAgIGNvbnN0IGVycm9yVVJMID0gYCR7ZG9tYWlufSR7QUNTX0xPR0dFUl9VUkx9YDsgICBcbiAgICBmZXRjaChlcnJvclVSTCwge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGVycm9yUGF5bG9hZCksXG4gICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZSdcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24ocmVzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlcyk7XG4gICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgIH0pO1xuICAgIH07XG59OyIsIi8vIEB0cy1ub2NoZWNrXG4vKiogQG1vZHVsZSBiYXNlL2V2ZW50cyAqL1xuXG5pbXBvcnQge1xuICBHRU5FU1lTX0NPQlJPV1NFX0NPTkZJR1VSQVRJT04sXG4gIEdXRV9TRU5EX0RJU1BPU0lUSU9OX0NPREUsXG4gIE1PTklUT1JJTkdKU19SRVFVRVNULFxuICBNT05JVE9SSU5HSlNfSEVBUlRCRUFULFxuICBHRU5FU1lTX1FVQUxJRklFRF9MRUFELFxuICBDQU5DRUxfU0lURV9TVUJTLFxuICBDSEVDS19BSF9UT0tFTixcbiAgR1JBQl9IRUFSVEJFQVRfREFUQSxcbiAgR0VORVNZU19SRVFVRVNUX1RDX1VQREFURSxcbiAgR0VORVNZU19SRVFVRVNUX05BVElWRV9DSEFULFxuICBHRU5FU1lTX1JFUVVFU1RfRkVUQ0hfU0VTU0lPTixcbiAgR0VORVNZU19TRVRfQUdFTlRfSUQsXG59IGZyb20gXCIuL3dpZGdldC1jb25zdGFudHNcIjtcblxuaW1wb3J0IGdlbmVzeXNDb2Jyb3dzZSBmcm9tIFwiLi93aWRnZXQtYXBpL2NvLWJyb3dzZVwiO1xuaW1wb3J0IHNlbmREaXNwb3NpdGlvbkNvZGUgZnJvbSBcIi4vd2lkZ2V0LWFwaS9zZW5kLWRpc3Bvc2l0aW9uLWNvZGVcIjtcbmltcG9ydCBnZW5lc3lzQWdlbnRRdWFsaWZpZWRMZWFkIGZyb20gXCIuL3dpZGdldC1hcGkvYWdlbnQtaW5jZW50aXZlXCI7XG5pbXBvcnQgbW9uaXRvcmluZ1JlcXVlc3QgZnJvbSBcIi4vc2FsZXMvcmVxdWVzdFwiO1xuaW1wb3J0IG1vbml0b3JpbmdIZWFydGJlYXQgZnJvbSBcIi4vc2FsZXMvaGVhcnRiZWF0XCI7XG5pbXBvcnQge1xuICBwb3N0TmF0aXZlQ2hhdFVwZGF0ZSxcbiAgcG9zdFRvQ2FuY2VsU3Vic09uU2l0ZSxcbiAgcG9zdFRvQ2hlY2tBSFRva2VuLFxuICBwb3N0Q2hhdERldGFpbHMsXG59IGZyb20gXCIuL3B1YnN1Yi9wb3N0LW1lc3NhZ2VzXCI7XG5pbXBvcnQgeyBncmFiSGVhcnRiZWF0RGF0YSB9IGZyb20gXCIuL3NhbGVzL3Jlc3BvbnNlXCI7XG5pbXBvcnQgeyBsb2dHZW5lc3lzRXZlbnQgfSBmcm9tIFwiLi91dGlsaXRpZXMvdXRpbGl0aWVzXCI7XG5cbmltcG9ydCByZXF1ZXN0VGNVcGRhdGUgZnJvbSBcIi4vc2FsZXMvcmVxdWVzdC10Yy11cGRhdGVcIjtcbmltcG9ydCBmZXRjaFJlZklEIGZyb20gXCIuL3NhbGVzL2ZldGNoLXJlZklEXCI7XG5sZXQgYWhfdG9rZW5SZWNlaXZlZCA9IGZhbHNlO1xubGV0IHJlZklEUmVxdWVzdFJlY2VpdmVkID0gZmFsc2U7XG5sZXQgcmVmSURFdmVudERhdGE6IHsgdGl0bGU6IHN0cmluZzsgZGV0YWlsOiBhbnkgfSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbi8vIE5lZWQgdG8gdXBkYXRlIGZvciBmaW5hbCBzdWJtaXQgcGFnZS5cbmNvbnN0IHNob3VsZEZpcmVSZWZJRENoZWNrID0gKHJlcXVlc3RUeXBlOiBzdHJpbmcpID0+IHtcbiAgaWYgKHJlZklERXZlbnREYXRhKVxuICAgIHJldHVybiBmZXRjaFJlZklEKHJlZklERXZlbnREYXRhLnRpdGxlLCByZWZJREV2ZW50RGF0YS5kZXRhaWwpO1xuICByZXR1cm47XG59O1xuXG4vKipcbiAqIEluaXRpYWxpemluZyBzdWJzY3JpcHRpb25zXG4gKiBAZGVzYyBJbml0aWFsaXplIHN1YnNjcmlwdGlvbnMuIFRoZXNlIHN1YnNjcmlwdGlvbnMgd2lsbCB3YWl0IG9uIHB1Ymxpc2hlcyBmcm9tIHRoZSB3aWRnZXRcbiAqIEBleGFtcGxlXG4gIFRlYWxpdW1QdWJTdWIuc3Vic2NyaWJlKENPTUVURF9SRVFVRVNUX0RJU0NPTk5FQ1QsIGNvbWV0ZERpc2Nvbm5lY3QpO1xuXG4gIFRlYWxpdW1QdWJTdWIuc3Vic2NyaWJlKENPTUVURF9OT1RJRllfU1RPUF9UWVBJTkcsIGNvbWV0ZFR5cGluZyk7XG4gIFRlYWxpdW1QdWJTdWIuc3Vic2NyaWJlKENPTUVURF9OT1RJRllfU1RBUlRfVFlQSU5HLCBjb21ldGRUeXBpbmcpO1xuICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShDT01FVERfTk9USUZZX1JFQURfUkVDRUlQVCwgY29tZXRkVHlwaW5nKTtcblxuICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShDT01FVERfUkVRVUVTVF9DSEFOTkVMLCBjb21ldGRSZXF1ZXN0Q2hhbm5lbCk7XG4gIFRlYWxpdW1QdWJTdWIuc3Vic2NyaWJlKENPTUVURF9SRVFVRVNUX1NFTkRfTUVTU0FHRSwgY29tZXRkU2VuZE1lc3NhZ2UpO1xuICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShDT01FVERfUkVRVUVTVF9DSEFOTkVMX1NVQlNDUklQVElPTiwgY29tZXRkU3Vic2NyaWJlQ2hhbm5lbCk7XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpIHtcbiAgVGVhbGl1bVB1YlN1Yi5zdWJzY3JpYmUoTU9OSVRPUklOR0pTX1JFUVVFU1QsIG1vbml0b3JpbmdSZXF1ZXN0KTtcbiAgVGVhbGl1bVB1YlN1Yi5zdWJzY3JpYmUoTU9OSVRPUklOR0pTX0hFQVJUQkVBVCwgbW9uaXRvcmluZ0hlYXJ0YmVhdCk7XG4gIFRlYWxpdW1QdWJTdWIuc3Vic2NyaWJlKEdFTkVTWVNfUVVBTElGSUVEX0xFQUQsIGdlbmVzeXNBZ2VudFF1YWxpZmllZExlYWQpO1xuICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShHRU5FU1lTX0NPQlJPV1NFX0NPTkZJR1VSQVRJT04sIGdlbmVzeXNDb2Jyb3dzZSk7XG4gIFRlYWxpdW1QdWJTdWIuc3Vic2NyaWJlKEdXRV9TRU5EX0RJU1BPU0lUSU9OX0NPREUsIHNlbmREaXNwb3NpdGlvbkNvZGUpO1xuICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShDQU5DRUxfU0lURV9TVUJTLCBwb3N0VG9DYW5jZWxTdWJzT25TaXRlKTtcbiAgVGVhbGl1bVB1YlN1Yi5zdWJzY3JpYmUoQ0hFQ0tfQUhfVE9LRU4sIHBvc3RUb0NoZWNrQUhUb2tlbik7XG4gIFRlYWxpdW1QdWJTdWIuc3Vic2NyaWJlKEdSQUJfSEVBUlRCRUFUX0RBVEEsIGdyYWJIZWFydGJlYXREYXRhKTtcblxuICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShHRU5FU1lTX1JFUVVFU1RfVENfVVBEQVRFLCByZXF1ZXN0VGNVcGRhdGUpO1xuICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShHRU5FU1lTX1JFUVVFU1RfTkFUSVZFX0NIQVQsIHBvc3ROYXRpdmVDaGF0VXBkYXRlKTtcbiAgVGVhbGl1bVB1YlN1Yi5zdWJzY3JpYmUoXG4gICAgR0VORVNZU19SRVFVRVNUX0ZFVENIX1NFU1NJT04sXG4gICAgKHRpdGxlOiBzdHJpbmcsIGRldGFpbDogb2JqZWN0IHwgc3RyaW5nKSA9PiB7XG4gICAgICByZWZJREV2ZW50RGF0YSA9IHtcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIGRldGFpbCxcbiAgICAgIH07XG4gICAgICBzaG91bGRGaXJlUmVmSURDaGVjayhcIlJFRl9JRF9DSEVDS19SRUNFSVZFRFwiKTtcbiAgICB9XG4gICk7XG5cblxubG9nR2VuZXN5c0V2ZW50KDEsICdUZWFsaXVtUHViU3ViIFN1YnNjcmliaW5nJywgYHN1YnNjcmliaW5nOiAke01PTklUT1JJTkdKU19SRVFVRVNUfSwgJHtNT05JVE9SSU5HSlNfSEVBUlRCRUFUfSwgJHtHRU5FU1lTX0NPQlJPV1NFX0NPTkZJR1VSQVRJT059LCAke0dXRV9TRU5EX0RJU1BPU0lUSU9OX0NPREV9LCAke0dFTkVTWVNfUkVRVUVTVF9OQVRJVkVfQ0hBVH0sICR7R0VORVNZU19SRVFVRVNUX0ZFVENIX1NFU1NJT059YCk7XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwiLy8gQHRzLW5vY2hlY2tcblxuLyoqIEBtb2R1bGUgcHVic3ViL2FkZC1wdWItc3ViICovXG5pbXBvcnQgcHViU3ViIGZyb20gJy4vcHViLXN1Yic7XG5pbXBvcnQge1xuICBkZXRlcm1pbmVDaGF0RW52LFxuICBsb2dHZW5lc3lzRXZlbnQsXG59IGZyb20gJy4uL3V0aWxpdGllcy91dGlsaXRpZXMnO1xuXG4vKipcbiAqIEluIEJvcm5lbyB3ZSBuZWVkIHRvIGFkZCB0aGUgcHViIHNjcmlwdCBmaXJzdFxuICogV2lsbCBhcHBlbmQgbmV3bHkgY3JlYXRlZCBkaXYgdG8gZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKSB7XG4gIGRldGVybWluZUNoYXRFbnYoKTtcbiAgcHViU3ViKCk7XG4gIGxvZ0dlbmVzeXNFdmVudCgxLCAnUHViU3ViJywgJ2FkZGluZyBUZWFsaXVtUHViU3ViJyk7XG4gIHJldHVybiBmYWxzZTtcbn1cbiIsIi8vIEB0cy1ub2NoZWNrXG5cbi8qKiBAbW9kdWxlIHB1YnN1Yi9ib290c3RyYXAgKi9cblxuaW1wb3J0IHtcbiAgQ0hBVF9JTklUSUFMSVpBVElPTixcbiAgV0lER0VUX1JFUVVFU1RfQ09ORklHVVJBVElPTixcbiAgV0lER0VUX1JFUVVFU1RfQ09ORklHVVJBVElPTl9TVUNDRVNTRlVMLFxufSBmcm9tIFwiLi4vd2lkZ2V0LWNvbnN0YW50c1wiO1xuXG5pbXBvcnQgYWRkUHViU3ViIGZyb20gXCIuL2FkZC1wdWItc3ViXCI7XG5pbXBvcnQgc3Vic2NyaXB0aW9ucyBmcm9tIFwiLi9zdWJzY3JpcHRpb25zXCI7XG5pbXBvcnQgeyBnZXREb21haW4sIGlzU3BhbmlzaCwgd2hpY2hWZXJzaW9uIH0gZnJvbSBcIi4uL3V0aWxpdGllcy91dGlsaXRpZXNcIjtcblxuYWRkUHViU3ViKCk7XG5UZWFsaXVtUHViU3ViLnN1YnNjcmliZShDSEFUX0lOSVRJQUxJWkFUSU9OLCAoKSA9PiB7XG4gIFRlYWxpdW1QdWJTdWIucHVibGlzaChXSURHRVRfUkVRVUVTVF9DT05GSUdVUkFUSU9OLCB7XG4gICAgc3Bpbm5lcjogdHJ1ZSxcbiAgICB2ZXJzaW9uOiB3aGljaFZlcnNpb24oKSxcbiAgICBjb250YWluZXI6IFwiY2hhdC1wbGFjZWhvbGRlclwiLFxuICAgIG5hbWU6IFwid3d3LWNoYXRcIixcbiAgICBsYW5ndWFnZTogaXNTcGFuaXNoKCksXG4gICAgcGF0aDogZ2V0RG9tYWluKCksXG4gICAgb3B0aW9uczogeyBza2lwQmFiZWxQb2x5RmlsbDogdHJ1ZSB9LFxuICB9KTtcbn0pO1xuXG5UZWFsaXVtUHViU3ViLnN1YnNjcmliZShXSURHRVRfUkVRVUVTVF9DT05GSUdVUkFUSU9OX1NVQ0NFU1NGVUwsIHN1YnNjcmlwdGlvbnMpO1xuIiwiLy8gQHRzLW5vY2hlY2tcblxuLyoqIEBtb2R1bGUgcHVic3ViL3BsYWNlaG9sZGVyICovXG5pbXBvcnQge1xuICBsb2dHZW5lc3lzRXZlbnQsXG59IGZyb20gJy4uL3V0aWxpdGllcy91dGlsaXRpZXMnO1xuXG4vKipcbiAqIFdpbGwgY3JlYXRlIGRpdiBlbGVtZW50LCBhZGQgYXR0cmlidXRlIFwiY2hhdC1wbGFjZWhvbGRlclwiXG4gKiBXaWxsIGFwcGVuZCBuZXdseSBjcmVhdGVkIGRpdiB0byBkb2N1bWVudFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpOiBib29sZWFuIHtcbiAgbG9nR2VuZXN5c0V2ZW50KDEsICdQbGFjZWhvbGRlcicsICdhcHBlbmRpbmcgZGl2I2NoYXQtcGxhY2Vob2xkZXIgdG8gYm9keScpO1xuICBjb25zdCAkZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICRkaXYuaWQgPSAnY2hhdC1wbGFjZWhvbGRlcic7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoJGRpdik7XG4gIHJldHVybiBmYWxzZTtcbn1cbiIsIi8vIEB0cy1ub2NoZWNrXG5cbi8qKlxuICogUG9zdE1lc3NhZ2VzXG4gKiBUaGUgZm9sbG93aW5nIHNjcmlwdCBwcm92aWRlcyB0aGUgcG9zdCBtZXNzYWdlIHNjcmlwdHMgdGhhdCBwcm92aWRlIGNvbW11bmljYXRpb24gYmFjayBhbmQgZm9ydGhcbiAqIHdpdGggdGhlIHdpZGdldC4gQWxsIG9mIHRoZSBtZXNzYWdlcyB3aWxsIGJlIGtlcHQgaW4gdGhpcyBmaWxlIGFuZCBub3Qgc2V0IGFzIGEgZnVuY3Rpb24gc28gdGhlXG4gKiBjb3VudGVycyB3aWxsIGJlIHJlbWVtYmVyZWQgYW5kIHN0b3JlZC5cbiAqXG4gKi9cbmltcG9ydCB7XG4gIEJPRkEsXG4gIEJPRkFfU0FMRV9JTkRJQ0FUT1JTLFxuICBDQU5DRUxfSEVBUlRCRUFULFxuICBDQU5DRUxfV0lER0VUX1NVQlMsXG4gIENBTkNFTF9TSVRFX1NVQlMsXG4gIEdFTkVTWVNfU1VTUEVORF9NT05JVE9SSU5HLFxuICBDSEVDS19BSF9UT0tFTixcbiAgQ0hFQ0tfRk9SX1NBTEUsXG4gIEdSQUJfSEVBUlRCRUFUX0RBVEEsXG4gIElOUV9DTElFTlRfT1JERVJfTlVNLFxuICBNTF9TQUxFX0lORElDQVRPUlMsXG4gIFNFVF9NT05JVE9SSU5HX1NUQVRVUyxcbiAgU0VORF9QUk9YWV9EQVRBLFxuICBTSVRFX0lORk9fQVZBSUxBQkxFLFxuICBjaGF0U2l0ZVBhcmFtcyxcbiAgR0VORVNZU19SRVFVRVNUX05BVElWRV9DSEFULFxuICBHRU5FU1lTX1NFVF9BR0VOVF9JRCxcbn0gZnJvbSBcIi4uL3dpZGdldC1jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIGdldEN1cnJlbnREb21haW4sXG4gIGlzU2FsZVByZXNlbnQsXG4gIGxvZ0dlbmVzeXNFdmVudCxcbiAgcXVlcnlTdHJpbmdQYXJzZSxcbiAgcHJveHlDaGF0RERPLFxuICB3aGljaERvbWFpbixcbiAgcHVibGlzaFdpbmRvdyxcbiAgaXNWNlxufSBmcm9tIFwiLi4vdXRpbGl0aWVzL3V0aWxpdGllc1wiO1xuXG5sZXQgY2hhdFdpbmRvdzogV2luZG93IHwgbnVsbDtcbmxldCBjaGF0U2l0ZUhvc3QgPSBcIlwiO1xubGV0IHNpdGVJbmZvRmlyZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gdGVybWluYXRlR2VuZXN5c0NoYXQoKSB7XG4gIGxvZ0dlbmVzeXNFdmVudChcbiAgICAxLFxuICAgIFwiQ2FuY2VsIEFsbCBXaWRnZXQgU3Vic2NyaXB0aW9uc1wiLFxuICAgIFwiU3VzcGVuc2lvbiBvZiBNb25pdG9yaW5nIEhlYXJ0YmVhdCBFdmVudHMgYW5kIEFsbCBXaWRnZXQgU3Vic1wiXG4gICk7XG5cbiAgVGVhbGl1bVB1YlN1Yi5wdWJsaXNoKEdFTkVTWVNfU1VTUEVORF9NT05JVE9SSU5HKTtcbiAgVGVhbGl1bVB1YlN1Yi5jbGVhckFsbFN1YnNjcmlwdGlvbnMoKTtcbn1cblxuZnVuY3Rpb24gc2VuZFBvc3RNZXNzYWdlKGRhdGE6IHN0cmluZyB8IG9iamVjdCkge1xuICBpZiAoIWNoYXRTaXRlSG9zdCAmJiB3aW5kb3cuYmFjdG1fZW52U2VsZWN0b3IgPT09IFwibm90cHJvZFwiKSB7XG4gICAgY29uc3QgdjYgPSBpc1Y2KCk7XG4gICAgY2hhdFNpdGVIb3N0ID0gdjYgPyBPYmplY3QudmFsdWVzKHNwYVdpZGdldFBhcmFtc1tcImd0LWNoYXQtd2lkZ2V0XCJdKVswXS5zaXRlUGFyYW1zLmRvbWFpbnNbZ2V0Q3VycmVudERvbWFpbigpXS5jaGF0U2l0ZUhvc3QgOiBPYmplY3QudmFsdWVzKHNwYVdpZGdldFBhcmFtc1tcInd3dy1jaGF0XCJdKVswXS5zaXRlUGFyYW1zXG4gICAgICAuZG9tYWluc1tnZXRDdXJyZW50RG9tYWluKCldLmNoYXRTaXRlSG9zdDtcbiAgfVxuICBpZiAoY2hhdFdpbmRvdykgY2hhdFdpbmRvdy5wb3N0TWVzc2FnZShkYXRhLCBjaGF0U2l0ZUhvc3QpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVQb3N0TWVzc2FnZShldmVudDogYW55KSB7XG4gIGNvbnN0IHY2ID0gaXNWNigpO1xuICBjb25zdCB3aWRnZXROYW1lID0gdjYgPyBcImd0LWNoYXQtd2lkZ2V0XCIgOiBcInd3dy1jaGF0XCI7XG4gIGlmIChldmVudC5kYXRhID09PSBcIkdFVF9RU19ERE9cIikge1xuICAgIGNvbnN0IGN1cnJlbnRUTEQgPSBnZXRDdXJyZW50RG9tYWluKCk7XG4gICAgY2hhdFdpbmRvdyA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNoYXRXaW5kb3dcIikgYXMgSFRNTElGcmFtZUVsZW1lbnQpXG4gICAgICA/LmNvbnRlbnRXaW5kb3c7XG4gICAgY2hhdFNpdGVIb3N0ID0gT2JqZWN0LnZhbHVlcyhzcGFXaWRnZXRQYXJhbXNbd2lkZ2V0TmFtZV0pWzBdLnNpdGVQYXJhbXNcbiAgICAgIC5kb21haW5zW2N1cnJlbnRUTERdLmNoYXRTaXRlSG9zdDtcbiAgICBjaGF0V2luZG93Py5wb3N0TWVzc2FnZShcbiAgICAgIHtcbiAgICAgICAgaHJlZjogd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgICAgIGRkbzogd2luZG93LmRpZ2l0YWxEYXRhLFxuICAgICAgICB0aXRsZTogd2luZG93LmRvY3VtZW50LnRpdGxlLFxuICAgICAgfSxcbiAgICAgIGNoYXRTaXRlSG9zdFxuICAgICk7XG4gIH1cblxuICBpZiAoZXZlbnQuZGF0YSA9PT0gXCJBSF9DT09LSUVfU0VUXCIpIHtcbiAgICBwdWJsaXNoV2luZG93KFwiQUhfQ09PS0lFX1NFVFwiLCB7fSk7XG4gIH1cbiAgaWYgKGV2ZW50LmRhdGEuZXZlbnQgPT09IFwiY2hhdFByZVN1cnZleVZpZXdcIikge1xuICAgIHdpbmRvdy5kYXRhQ29sbGVjdG9yLnB1c2goZXZlbnQuZGF0YSk7XG4gIH1cblxuICBpZiAoZXZlbnQuZGF0YS51dGFnSW5pdCkge1xuICAgIGNvbnN0IHY2ID0gaXNWNigpO1xuICAgIGNvbnN0IHdpZGdldE5hbWUgPSB2NiA/IFwiZ3QtY2hhdC13aWRnZXRcIiA6IFwid3d3LWNoYXRcIjtcbiAgICBjb25zdCBjdXJyZW50VExEID0gZ2V0Q3VycmVudERvbWFpbigpO1xuICAgIGNoYXRXaW5kb3cgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjaGF0V2luZG93XCIpIGFzIEhUTUxJRnJhbWVFbGVtZW50KVxuICAgICAgPy5jb250ZW50V2luZG93O1xuICAgIGNoYXRTaXRlSG9zdCA9IE9iamVjdC52YWx1ZXMoc3BhV2lkZ2V0UGFyYW1zW3dpZGdldE5hbWVdKVswXS5zaXRlUGFyYW1zXG4gICAgICAuZG9tYWluc1tjdXJyZW50VExEXS5jaGF0U2l0ZUhvc3Q7XG4gICAgY29uc3Qgc2hvd0RlYnVnQ29uc29sZSA9IHF1ZXJ5U3RyaW5nUGFyc2UoXCJkZWJ1Z0NoYXRcIikgPT09IFwiMVwiO1xuICAgIC8vIHNldHRpbmcgY2hhdHNpdGUgc3BhUGFyYW1zIHRvIGxvY2FsIGt2cCBvbiB0aGUgd2lkZ2V0XG4gICAgY2hhdFNpdGVQYXJhbXMuc3BhUGFyYW1zID0gZXZlbnQ/LmRhdGE/LnNwYVBhcmFtcz8uc2l0ZVBhcmFtcz8uZG9tYWlucztcbiAgICAvLyB0cmlnZ2VyaW5nIHB1Yi9zdWIgdGhhdCBkYXRhIGZyb20gdGhlIGNoYXRzaXRlIGhhcyBiZWVuIHJlY2VpdmVkLlxuXG4gICAgY29uc3QgYmFjdG1Db29raWVzID0gbmV3IGJhY3RtLkNvb2tpZXMoKTtcbiAgICBjb25zdCBjb29raWVFeGlzdHMgPSBiYWN0bUNvb2tpZXMuZ2V0KFwib2NjdENoYXRcIik7XG4gICAgY29uc3Qgb2NjdENoYXRDb29raWUgPSBjb29raWVFeGlzdHMgPyBKU09OLnBhcnNlKGNvb2tpZUV4aXN0cykgOiBcIlwiO1xuICAgIGxldCBjaGF0UmVmSURGb3VuZCA9IG9jY3RDaGF0Q29va2llLmNoYXRSZWZJRFxuICAgICAgPyBvY2N0Q2hhdENvb2tpZS5jaGF0UmVmSURcbiAgICAgIDogXCJcIjtcblxuICAgIGNvbnN0IGx0c0Nvb2tpZUV4aXN0cyA9IGJhY3RtQ29va2llcy5nZXQoXCJvY2N0Q2hhdF9sdHNcIik7XG4gICAgY29uc3Qgb2NjdENoYXRMdHNDb29raWUgPSBsdHNDb29raWVFeGlzdHNcbiAgICAgID8gSlNPTi5wYXJzZShsdHNDb29raWVFeGlzdHMpXG4gICAgICA6IFwiXCI7XG4gICAgbGV0IGFnZW50SURGb3VuZCA9IG9jY3RDaGF0THRzQ29va2llLnNlY3VyZUFnZW50SURcbiAgICAgID8gb2NjdENoYXRMdHNDb29raWUuc2VjdXJlQWdlbnRJRFxuICAgICAgOiBcIlwiO1xuICAgIGxldCBjaGF0SURGb3VuZCA9IG9jY3RDaGF0THRzQ29va2llLml4X2lkID8gb2NjdENoYXRMdHNDb29raWUuaXhfaWQgOiBcIlwiO1xuICAgIGlmIChjaGF0SURGb3VuZCAmJiBjaGF0UmVmSURGb3VuZCAmJiBhZ2VudElERm91bmQpIHtcbiAgICAgIHBvc3ROYXRpdmVDaGF0VXBkYXRlKEdFTkVTWVNfUkVRVUVTVF9OQVRJVkVfQ0hBVCwge1xuICAgICAgICBjdXJyZW50V2ViUGFnZTogd2luZG93LmRvY3VtZW50LnRpdGxlLFxuICAgICAgICBDSEFUX0lEOiBjaGF0SURGb3VuZCxcbiAgICAgICAgYWdlbnRJRDogYWdlbnRJREZvdW5kLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChjaGF0U2l0ZVBhcmFtcy5zcGFQYXJhbXMgJiYgIXNpdGVJbmZvRmlyZWQpIHtcbiAgICAgIFRlYWxpdW1QdWJTdWIucHVibGlzaChTSVRFX0lORk9fQVZBSUxBQkxFLCBjaGF0U2l0ZVBhcmFtcy5zcGFQYXJhbXMpO1xuICAgICAgc2l0ZUluZm9GaXJlZCA9IHRydWU7XG4gICAgfVxuICAgIGxvZ0dlbmVzeXNFdmVudCgxLCBcIlNpdGUgSW5mbyBBdmFpbGFibGVcIiwgY2hhdFNpdGVQYXJhbXMpO1xuICAgIGNvbnN0IGRhdGFUb1NlbmQgPSB7XG4gICAgICB1dGFnSW5pdDoge1xuICAgICAgICBwb3N0TWVzc2FnZU9yaWdpbjogd2luZG93LmxvY2F0aW9uLm9yaWdpbixcbiAgICAgICAgc2hvd0RlYnVnQ29uc29sZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBzZW5kUG9zdE1lc3NhZ2UoZGF0YVRvU2VuZCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBldmVudC5kYXRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKGV2ZW50Lm9yaWdpbiAhPT0gY2hhdFNpdGVIb3N0KSB7XG4gICAgICBsb2dHZW5lc3lzRXZlbnQoMiwgXCJJbmNvcnJlY3QgUG9zdCBNZXNzYWdlIE9yaWdpblwiLCBldmVudC5vcmlnaW4pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZXZlbnQuZGF0YSkge1xuICAgICAgY2FzZSBDQU5DRUxfV0lER0VUX1NVQlM6XG4gICAgICAgIHRlcm1pbmF0ZUdlbmVzeXNDaGF0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBHUkFCX0hFQVJUQkVBVF9EQVRBOlxuICAgICAgICBUZWFsaXVtUHViU3ViLnB1Ymxpc2goR1JBQl9IRUFSVEJFQVRfREFUQSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDSEVDS19GT1JfU0FMRTpcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuICAgICAgICB3aGljaERvbWFpbigpID09PSBCT0ZBXG4gICAgICAgICAgPyBjaGVja0ZvclNhbGVJbmRpY2F0b3JzKFxuICAgICAgICAgICAgZGlnaXRhbERhdGEuY2FydCxcbiAgICAgICAgICAgIFwiZGlnaXRhbERhdGEuY2FydFwiLFxuICAgICAgICAgICAgQk9GQV9TQUxFX0lORElDQVRPUlNcbiAgICAgICAgICApXG4gICAgICAgICAgOiBjaGVja0ZvclNhbGVJbmRpY2F0b3JzKFxuICAgICAgICAgICAgZGlnaXRhbERhdGEucGFnZS5hdHRyaWJ1dGVzLmNoYXQsXG4gICAgICAgICAgICBcImRpZ2l0YWxEYXRhLnBhZ2UuYXR0cmlidXRlcy5jaGF0XCIsXG4gICAgICAgICAgICBNTF9TQUxFX0lORElDQVRPUlNcbiAgICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ0FOQ0VMX0hFQVJUQkVBVDpcbiAgICAgICAgVGVhbGl1bVB1YlN1Yi5wdWJsaXNoKEdFTkVTWVNfU1VTUEVORF9NT05JVE9SSU5HKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tGb3JTYWxlSW5kaWNhdG9ycyhcbiAgZGRvTG9jYXRpb246IG9iamVjdCxcbiAgZGRvTG9jYXRpb25TdHI6IHN0cmluZyxcbiAgc2FsZUluZGljYXRvcnM6IGFueVtdXG4pIHtcbiAgaWYgKFxuICAgIGJhY3RtICYmXG4gICAgYmFjdG0ucG9seWZpbGxzICYmXG4gICAgYmFjdG0ucG9seWZpbGxzLm9iamVjdC5leGlzdHMod2luZG93LCBkZG9Mb2NhdGlvblN0cilcbiAgKSB7XG4gICAgY29uc3Qgc2FsZVByZXNJbmQgPSBpc1NhbGVQcmVzZW50KGRkb0xvY2F0aW9uKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG4gICAgc2FsZVByZXNJbmRcbiAgICAgID8gc2VuZFByb3h5UG9zdE1lc3NhZ2UoSU5RX0NMSUVOVF9PUkRFUl9OVU0sIHNhbGVQcmVzSW5kKVxuICAgICAgOiBzYWxlSW5kaWNhdG9ycy5mb3JFYWNoKChpbmRpY2F0b3IpID0+XG4gICAgICAgIHByb3h5Q2hhdERETyhkZG9Mb2NhdGlvbiwgaW5kaWNhdG9yKVxuICAgICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9zdFRvQ2FuY2VsU3Vic09uU2l0ZSgpIHtcbiAgdGVybWluYXRlR2VuZXN5c0NoYXQoKTtcbiAgc2VuZFBvc3RNZXNzYWdlKENBTkNFTF9TSVRFX1NVQlMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9zdFRvQ2hlY2tBSFRva2VuKCkge1xuICBzZW5kUG9zdE1lc3NhZ2UoQ0hFQ0tfQUhfVE9LRU4pO1xufVxuXG4vLyBUaGlzIHNlbmRzIHRoZSBuYXRpdmVDaGF0IGRhdGEgdG8gdGhlIGNoYXRTaXRlXG5leHBvcnQgZnVuY3Rpb24gcG9zdE5hdGl2ZUNoYXRVcGRhdGUoZXZlbnRuYW1lOiBzdHJpbmcsIGRhdGFUb1NlbmQ6IG9iamVjdCkge1xuICBjb25zdCBuYXRpdmVDaGF0RGF0YSA9IHtcbiAgICBtZXNzYWdlOiBHRU5FU1lTX1JFUVVFU1RfTkFUSVZFX0NIQVQsXG4gICAgZGF0YVRvU2VuZCxcbiAgfTtcbiAgc2VuZFBvc3RNZXNzYWdlKHsgdnRpbURhdGE6IHsgLi4ubmF0aXZlQ2hhdERhdGEgfSB9KTtcbn1cblxuLy8gVGhpcyBpcyBmb3IgYWNzIG9ubHlcbmV4cG9ydCBmdW5jdGlvbiBwb3N0Q2hhdERldGFpbHMoXG4gIGV2ZW50bmFtZTogc3RyaW5nLFxuICBkYXRhVG9TZW5kOiBvYmplY3QgfCBzdHJpbmdcbikge1xuICBjb25zdCBjaGF0QWdlbnREZXRhaWxzID0ge1xuICAgIG1lc3NhZ2U6IEdFTkVTWVNfU0VUX0FHRU5UX0lELFxuICAgIGRhdGFUb1NlbmQsXG4gIH07XG4gIHNlbmRQb3N0TWVzc2FnZSh7IHZ0aW1EYXRhOiB7IC4uLmNoYXRBZ2VudERldGFpbHMgfSB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldE1vbml0b3JpbmdTdGF0dXMoc3RhdGUgPSBmYWxzZSkge1xuICB0cnkge1xuICAgIGJhY3RtLmRkby5zZXQoXCJwYWdlLmF0dHJpYnV0ZXMuY2hhdC5tb25pdG9yaW5nXCIsIHN0YXRlKTtcbiAgICBjb25zdCBtb25pdG9yaW5nRGF0YSA9IHtcbiAgICAgIG1lc3NhZ2U6IFNFVF9NT05JVE9SSU5HX1NUQVRVUyxcbiAgICAgIG1vbml0b3JpbmdTdGF0dXM6IHN0YXRlLFxuICAgIH07XG4gICAgc2VuZFBvc3RNZXNzYWdlKHsgdnRpbURhdGE6IHsgLi4ubW9uaXRvcmluZ0RhdGEgfSB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ0dlbmVzeXNFdmVudCgzLCBcIlBNIHNldE1vbml0b3JpbmdTdGF0dXMgRXJyb3JcIiwgZSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRQcm94eVBvc3RNZXNzYWdlKGtleTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKSB7XG4gIGF3YWl0IHdpbmRvdy5ib2EuY2hhdC5yZWxvYWQoKTtcbiAgY29uc3QgbWVzc2FnZSA9IFNFTkRfUFJPWFlfREFUQTtcbiAgdHJ5IHtcbiAgICBzZW5kUG9zdE1lc3NhZ2Uoe1xuICAgICAgdnRpbURhdGE6IHsgbWVzc2FnZSwga2V5LCBuZXdWYWx1ZSwgZ2VuZXN5c0RhdGE6IHdpbmRvdy5nZW5lc3lzRGF0YSB9LFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7IH1cbn1cblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGhhbmRsZVBvc3RNZXNzYWdlLmJpbmQodGhpcyksIGZhbHNlKTtcbiIsIi8vIEB0cy1ub2NoZWNrXG5cbi8qIGVzbGludC1kaXNhYmxlICovXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxMCwyMDExLDIwMTIsMjAxMywyMDE0IE1vcmdhbiBSb2RlcmljayBodHRwOi8vcm9kZXJpY2suZGtcbiAqIExpY2Vuc2U6IE1JVCAtIGh0dHA6Ly9tcmducmRyY2subWl0LWxpY2Vuc2Uub3JnXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL21yb2Rlcmljay9QdWJTdWJKU1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gVE9ETyBpbiBmdXR1cmUgYWRkIGludGVyZmFjZXMgZm9yIFB1YlN1YiB0byBiZSBzaGFyZWQgd2l0aCBUZWFsaXVtUHViU3ViXG4gICAgY29uc3QgUHViU3ViOiBhbnkgPSB7fTtcblxuICAgIHZhciBtZXNzYWdlcyA9IHt9LFxuICAgICAgICBsYXN0VWlkID0gLTE7XG5cbiAgICBmdW5jdGlvbiBoYXNLZXlzKG9iajogeyBoYXNPd25Qcm9wZXJ0eTogKGFyZzA6IHN0cmluZykgPT4gYW55OyB9KXtcbiAgICAgICAgdmFyIGtleTtcblxuICAgICAgICBmb3IgKGtleSBpbiBvYmope1xuICAgICAgICAgICAgaWYgKCBvYmouaGFzT3duUHJvcGVydHkoa2V5KSApe1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB0aHJvd3MgdGhlIHBhc3NlZCBleGNlcHRpb24sIGZvciB1c2UgYXMgYXJndW1lbnQgZm9yIHNldFRpbWVvdXRcbiAgICAgKiBAYWxpYXMgdGhyb3dFeGNlcHRpb25cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyBPYmplY3QgfSBleCBBbiBFcnJvciBvYmplY3RcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aHJvd0V4Y2VwdGlvbiggZXg6IHVua25vd24gKXtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHJlVGhyb3dFeGNlcHRpb24oKXtcbiAgICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhbGxTdWJzY3JpYmVyV2l0aERlbGF5ZWRFeGNlcHRpb25zKCBzdWJzY3JpYmVyOiAoYXJnMDogYW55LCBhcmcxOiBhbnkpID0+IHZvaWQsIG1lc3NhZ2U6IGFueSwgZGF0YTogYW55ICl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyKCBtZXNzYWdlLCBkYXRhICk7XG4gICAgICAgIH0gY2F0Y2goIGV4ICl7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCB0aHJvd0V4Y2VwdGlvbiggZXggKSwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYWxsU3Vic2NyaWJlcldpdGhJbW1lZGlhdGVFeGNlcHRpb25zKCBzdWJzY3JpYmVyOiAoYXJnMDogYW55LCBhcmcxOiBhbnkpID0+IHZvaWQsIG1lc3NhZ2U6IGFueSwgZGF0YTogYW55ICl7XG4gICAgICAgIHN1YnNjcmliZXIoIG1lc3NhZ2UsIGRhdGEgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWxpdmVyTWVzc2FnZSggb3JpZ2luYWxNZXNzYWdlOiBhbnksIG1hdGNoZWRNZXNzYWdlOiBQcm9wZXJ0eUtleSwgZGF0YTogYW55LCBpbW1lZGlhdGVFeGNlcHRpb25zOiBhbnkgKXtcbiAgICAgICAgdmFyIHN1YnNjcmliZXJzID0gbWVzc2FnZXNbbWF0Y2hlZE1lc3NhZ2VdLFxuICAgICAgICAgICAgY2FsbFN1YnNjcmliZXIgPSBpbW1lZGlhdGVFeGNlcHRpb25zID8gY2FsbFN1YnNjcmliZXJXaXRoSW1tZWRpYXRlRXhjZXB0aW9ucyA6IGNhbGxTdWJzY3JpYmVyV2l0aERlbGF5ZWRFeGNlcHRpb25zLFxuICAgICAgICAgICAgcztcblxuICAgICAgICBpZiAoICFtZXNzYWdlcy5oYXNPd25Qcm9wZXJ0eSggbWF0Y2hlZE1lc3NhZ2UgKSApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAocyBpbiBzdWJzY3JpYmVycyl7XG4gICAgICAgICAgICBpZiAoIHN1YnNjcmliZXJzLmhhc093blByb3BlcnR5KHMpKXtcbiAgICAgICAgICAgICAgICBjYWxsU3Vic2NyaWJlciggc3Vic2NyaWJlcnNbc10sIG9yaWdpbmFsTWVzc2FnZSwgZGF0YSApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlRGVsaXZlcnlGdW5jdGlvbiggbWVzc2FnZTogUHJvcGVydHlLZXksIGRhdGE6IGFueSwgaW1tZWRpYXRlRXhjZXB0aW9uczogYW55ICl7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBkZWxpdmVyTmFtZXNwYWNlZCgpe1xuICAgICAgICAgICAgdmFyIHRvcGljID0gU3RyaW5nKCBtZXNzYWdlICksXG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSB0b3BpYy5sYXN0SW5kZXhPZiggJy4nICk7XG5cbiAgICAgICAgICAgIC8vIGRlbGl2ZXIgdGhlIG1lc3NhZ2UgYXMgaXQgaXMgbm93XG4gICAgICAgICAgICBkZWxpdmVyTWVzc2FnZShtZXNzYWdlLCBtZXNzYWdlLCBkYXRhLCBpbW1lZGlhdGVFeGNlcHRpb25zKTtcblxuICAgICAgICAgICAgLy8gdHJpbSB0aGUgaGllcmFyY2h5IGFuZCBkZWxpdmVyIG1lc3NhZ2UgdG8gZWFjaCBsZXZlbFxuICAgICAgICAgICAgd2hpbGUoIHBvc2l0aW9uICE9PSAtMSApe1xuICAgICAgICAgICAgICAgIHRvcGljID0gdG9waWMuc3Vic3RyKCAwLCBwb3NpdGlvbiApO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gdG9waWMubGFzdEluZGV4T2YoJy4nKTtcbiAgICAgICAgICAgICAgICBkZWxpdmVyTWVzc2FnZSggbWVzc2FnZSwgdG9waWMsIGRhdGEsIGltbWVkaWF0ZUV4Y2VwdGlvbnMgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXNzYWdlSGFzU3Vic2NyaWJlcnMoIG1lc3NhZ2U6IGFueSApe1xuICAgICAgICB2YXIgdG9waWMgPSBTdHJpbmcoIG1lc3NhZ2UgKSxcbiAgICAgICAgICAgIGZvdW5kID0gbWVzc2FnZXMuaGFzT3duUHJvcGVydHkoIHRvcGljICkgJiYgaGFzS2V5cyhtZXNzYWdlc1t0b3BpY10pLFxuICAgICAgICAgICAgcG9zaXRpb24gPSB0b3BpYy5sYXN0SW5kZXhPZiggJy4nICk7XG5cbiAgICAgICAgd2hpbGUgKCAhZm91bmQgJiYgcG9zaXRpb24gIT09IC0xICl7XG4gICAgICAgICAgICB0b3BpYyA9IHRvcGljLnN1YnN0ciggMCwgcG9zaXRpb24gKTtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gdG9waWMubGFzdEluZGV4T2YoICcuJyApO1xuICAgICAgICAgICAgZm91bmQgPSBtZXNzYWdlcy5oYXNPd25Qcm9wZXJ0eSggdG9waWMgKSAmJiBoYXNLZXlzKG1lc3NhZ2VzW3RvcGljXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHVibGlzaCggbWVzc2FnZTogUHJvcGVydHlLZXksIGRhdGE6IGFueSwgc3luYzogYm9vbGVhbiwgaW1tZWRpYXRlRXhjZXB0aW9uczogYW55ICl7XG4gICAgICAgIG1lc3NhZ2UgPSAodHlwZW9mIG1lc3NhZ2UgPT09ICdzeW1ib2wnKSA/IG1lc3NhZ2UudG9TdHJpbmcoKSA6IG1lc3NhZ2U7XG5cbiAgICAgICAgdmFyIGRlbGl2ZXIgPSBjcmVhdGVEZWxpdmVyeUZ1bmN0aW9uKCBtZXNzYWdlLCBkYXRhLCBpbW1lZGlhdGVFeGNlcHRpb25zICksXG4gICAgICAgICAgICBoYXNTdWJzY3JpYmVycyA9IG1lc3NhZ2VIYXNTdWJzY3JpYmVycyggbWVzc2FnZSApO1xuXG4gICAgICAgIGlmICggIWhhc1N1YnNjcmliZXJzICl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIHN5bmMgPT09IHRydWUgKXtcbiAgICAgICAgICAgIGRlbGl2ZXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoIGRlbGl2ZXIsIDAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQdWJsaXNoZXMgdGhlIG1lc3NhZ2UsIHBhc3NpbmcgdGhlIGRhdGEgdG8gaXQncyBzdWJzY3JpYmVyc1xuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBhbGlhcyBwdWJsaXNoXG4gICAgICogQHBhcmFtIHsgU3RyaW5nIH0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBwdWJsaXNoXG4gICAgICogQHBhcmFtIHt9IGRhdGEgVGhlIGRhdGEgdG8gcGFzcyB0byBzdWJzY3JpYmVyc1xuICAgICAqIEByZXR1cm4geyBCb29sZWFuIH1cbiAgICAgKi9cbiAgICBQdWJTdWIucHVibGlzaCA9IGZ1bmN0aW9uKCBtZXNzYWdlOiBQcm9wZXJ0eUtleSwgZGF0YTogYW55ICl7XG4gICAgICAgIHJldHVybiBwdWJsaXNoKCBtZXNzYWdlLCBkYXRhLCBmYWxzZSwgUHViU3ViLmltbWVkaWF0ZUV4Y2VwdGlvbnMgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHVibGlzaGVzIHRoZSB0aGUgbWVzc2FnZSBzeW5jaHJvbm91c2x5LCBwYXNzaW5nIHRoZSBkYXRhIHRvIGl0J3Mgc3Vic2NyaWJlcnNcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAYWxpYXMgcHVibGlzaFN5bmNcbiAgICAgKiBAcGFyYW0geyBTdHJpbmcgfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHB1Ymxpc2hcbiAgICAgKiBAcGFyYW0ge30gZGF0YSBUaGUgZGF0YSB0byBwYXNzIHRvIHN1YnNjcmliZXJzXG4gICAgICogQHJldHVybiB7IEJvb2xlYW4gfVxuICAgICAqL1xuICAgIFB1YlN1Yi5wdWJsaXNoU3luYyA9IGZ1bmN0aW9uKCBtZXNzYWdlOiBQcm9wZXJ0eUtleSwgZGF0YTogYW55ICl7XG4gICAgICAgIHJldHVybiBwdWJsaXNoKCBtZXNzYWdlLCBkYXRhLCB0cnVlLCBQdWJTdWIuaW1tZWRpYXRlRXhjZXB0aW9ucyApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTdWJzY3JpYmVzIHRoZSBwYXNzZWQgZnVuY3Rpb24gdG8gdGhlIHBhc3NlZCBtZXNzYWdlLiBFdmVyeSByZXR1cm5lZCB0b2tlbiBpcyB1bmlxdWUgYW5kIHNob3VsZCBiZSBzdG9yZWQgaWYgeW91IG5lZWQgdG8gdW5zdWJzY3JpYmVcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAYWxpYXMgc3Vic2NyaWJlXG4gICAgICogQHBhcmFtIHsgU3RyaW5nIH0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzdWJzY3JpYmUgdG9cbiAgICAgKiBAcGFyYW0geyBGdW5jdGlvbiB9IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhIG5ldyBtZXNzYWdlIGlzIHB1Ymxpc2hlZFxuICAgICAqIEByZXR1cm4geyBTdHJpbmcgfVxuICAgICAqL1xuICAgIFB1YlN1Yi5zdWJzY3JpYmUgPSBmdW5jdGlvbiggbWVzc2FnZTogUHJvcGVydHlLZXksIGZ1bmM6IGFueSApe1xuICAgICAgICBpZiAoIHR5cGVvZiBmdW5jICE9PSAnZnVuY3Rpb24nKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1lc3NhZ2UgPSAodHlwZW9mIG1lc3NhZ2UgPT09ICdzeW1ib2wnKSA/IG1lc3NhZ2UudG9TdHJpbmcoKSA6IG1lc3NhZ2U7XG5cbiAgICAgICAgLy8gbWVzc2FnZSBpcyBub3QgcmVnaXN0ZXJlZCB5ZXRcbiAgICAgICAgaWYgKCAhbWVzc2FnZXMuaGFzT3duUHJvcGVydHkoIG1lc3NhZ2UgKSApe1xuICAgICAgICAgICAgbWVzc2FnZXNbbWVzc2FnZV0gPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZvcmNpbmcgdG9rZW4gYXMgU3RyaW5nLCB0byBhbGxvdyBmb3IgZnV0dXJlIGV4cGFuc2lvbnMgd2l0aG91dCBicmVha2luZyB1c2FnZVxuICAgICAgICAvLyBhbmQgYWxsb3cgZm9yIGVhc3kgdXNlIGFzIGtleSBuYW1lcyBmb3IgdGhlICdtZXNzYWdlcycgb2JqZWN0XG4gICAgICAgIHZhciB0b2tlbiA9ICd1aWRfJyArIFN0cmluZygrK2xhc3RVaWQpO1xuICAgICAgICBtZXNzYWdlc1ttZXNzYWdlXVt0b2tlbl0gPSBmdW5jO1xuXG4gICAgICAgIC8vIHJldHVybiB0b2tlbiBmb3IgdW5zdWJzY3JpYmluZ1xuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFN1YnNjcmliZXMgdGhlIHBhc3NlZCBmdW5jdGlvbiB0byB0aGUgcGFzc2VkIG1lc3NhZ2Ugb25jZVxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBhbGlhcyBzdWJzY3JpYmVPbmNlXG4gICAgICogQHBhcmFtIHsgU3RyaW5nIH0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzdWJzY3JpYmUgdG9cbiAgICAgKiBAcGFyYW0geyBGdW5jdGlvbiB9IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhIG5ldyBtZXNzYWdlIGlzIHB1Ymxpc2hlZFxuICAgICAqIEByZXR1cm4geyBQdWJTdWIgfVxuICAgICAqL1xuICAgIFB1YlN1Yi5zdWJzY3JpYmVPbmNlID0gZnVuY3Rpb24oIG1lc3NhZ2U6IGFueSwgZnVuYzogYW55ICk6IHR5cGVvZiBQdWJTdWIge1xuICAgICAgICB2YXIgdG9rZW4gPSBQdWJTdWIuc3Vic2NyaWJlKCBtZXNzYWdlLCBmdW5jdGlvbiAodGhpczogYW55KXtcbiAgICAgICAgICAgIC8vIGJlZm9yZSBmdW5jIGFwcGx5LCB1bnN1YnNjcmliZSBtZXNzYWdlXG4gICAgICAgICAgICBQdWJTdWIudW5zdWJzY3JpYmUoIHRva2VuICk7XG4gICAgICAgICAgICBmdW5jLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBQdWJTdWI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgc3Vic2NyaXB0aW9uc1xuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAYWxpYXMgY2xlYXJBbGxTdWJzY3JpcHRpb25zXG4gICAgICovXG4gICAgUHViU3ViLmNsZWFyQWxsU3Vic2NyaXB0aW9ucyA9IGZ1bmN0aW9uIGNsZWFyQWxsU3Vic2NyaXB0aW9ucygpe1xuICAgICAgICBtZXNzYWdlcyA9IHt9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciBzdWJzY3JpcHRpb25zIGJ5IHRoZSB0b3BpY1xuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAYWxpYXMgY2xlYXJBbGxTdWJzY3JpcHRpb25zXG4gICAgICovXG4gICAgUHViU3ViLmNsZWFyU3Vic2NyaXB0aW9ucyA9IGZ1bmN0aW9uIGNsZWFyU3Vic2NyaXB0aW9ucyh0b3BpYzogc3RyaW5nKXtcbiAgICAgICAgdmFyIG07XG4gICAgICAgIGZvciAobSBpbiBtZXNzYWdlcyl7XG4gICAgICAgICAgICBpZiAobWVzc2FnZXMuaGFzT3duUHJvcGVydHkobSkgJiYgbS5pbmRleE9mKHRvcGljKSA9PT0gMCl7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG1lc3NhZ2VzW21dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgc3Vic2NyaXB0aW9uc1xuICAgICAqXG4gICAgICogLSBXaGVuIHBhc3NlZCBhIHRva2VuLCByZW1vdmVzIGEgc3BlY2lmaWMgc3Vic2NyaXB0aW9uLlxuICAgICAqXG4gICAgICogLSBXaGVuIHBhc3NlZCBhIGZ1bmN0aW9uLCByZW1vdmVzIGFsbCBzdWJzY3JpcHRpb25zIGZvciB0aGF0IGZ1bmN0aW9uXG4gICAgICpcbiAgICAgKiAtIFdoZW4gcGFzc2VkIGEgdG9waWMsIHJlbW92ZXMgYWxsIHN1YnNjcmlwdGlvbnMgZm9yIHRoYXQgdG9waWMgKGhpZXJhcmNoeSlcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcHVibGljXG4gICAgICogQGFsaWFzIHN1YnNjcmliZU9uY2VcbiAgICAgKiBAcGFyYW0geyBTdHJpbmcgfCBGdW5jdGlvbiB9IHZhbHVlIEEgdG9rZW4sIGZ1bmN0aW9uIG9yIHRvcGljIHRvIHVuc3Vic2NyaWJlIGZyb21cbiAgICAgKiBAZXhhbXBsZSAvLyBVbnN1YnNjcmliaW5nIHdpdGggYSB0b2tlblxuICAgICAqIHZhciB0b2tlbiA9IFB1YlN1Yi5zdWJzY3JpYmUoJ215dG9waWMnLCBteUZ1bmMpO1xuICAgICAqIFB1YlN1Yi51bnN1YnNjcmliZSh0b2tlbik7XG4gICAgICogQGV4YW1wbGUgLy8gVW5zdWJzY3JpYmluZyB3aXRoIGEgZnVuY3Rpb25cbiAgICAgKiBQdWJTdWIudW5zdWJzY3JpYmUobXlGdW5jKTtcbiAgICAgKiBAZXhhbXBsZSAvLyBVbnN1YnNjcmliaW5nIGZyb20gYSB0b3BpY1xuICAgICAqIFB1YlN1Yi51bnN1YnNjcmliZSgnbXl0b3BpYycpO1xuICAgICAqL1xuICAgIFB1YlN1Yi51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKHZhbHVlOiBhbnkpe1xuICAgICAgICB2YXIgZGVzY2VuZGFudFRvcGljRXhpc3RzID0gZnVuY3Rpb24odG9waWM6IHN0cmluZykge1xuICAgICAgICAgICAgICAgIHZhciBtO1xuICAgICAgICAgICAgICAgIGZvciAoIG0gaW4gbWVzc2FnZXMgKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCBtZXNzYWdlcy5oYXNPd25Qcm9wZXJ0eShtKSAmJiBtLmluZGV4T2YodG9waWMpID09PSAwICl7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGRlc2NlbmRhbnQgb2YgdGhlIHRvcGljIGV4aXN0czpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzVG9waWMgICAgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICggbWVzc2FnZXMuaGFzT3duUHJvcGVydHkodmFsdWUpIHx8IGRlc2NlbmRhbnRUb3BpY0V4aXN0cyh2YWx1ZSkgKSxcbiAgICAgICAgICAgIGlzVG9rZW4gICAgPSAhaXNUb3BpYyAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnLFxuICAgICAgICAgICAgaXNGdW5jdGlvbiA9IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyxcbiAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlLFxuICAgICAgICAgICAgbSwgbWVzc2FnZSwgdDtcblxuICAgICAgICBpZiAoaXNUb3BpYyl7XG4gICAgICAgICAgICBQdWJTdWIuY2xlYXJTdWJzY3JpcHRpb25zKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoIG0gaW4gbWVzc2FnZXMgKXtcbiAgICAgICAgICAgIGlmICggbWVzc2FnZXMuaGFzT3duUHJvcGVydHkoIG0gKSApe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlc1ttXTtcblxuICAgICAgICAgICAgICAgIGlmICggaXNUb2tlbiAmJiBtZXNzYWdlW3ZhbHVlXSApe1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbWVzc2FnZVt2YWx1ZV07XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbnMgYXJlIHVuaXF1ZSwgc28gd2UgY2FuIGp1c3Qgc3RvcCBoZXJlXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoIHQgaW4gbWVzc2FnZSApe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaGFzT3duUHJvcGVydHkodCkgJiYgbWVzc2FnZVt0XSA9PT0gdmFsdWUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlW3RdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICB3aW5kb3cuVGVhbGl1bVB1YlN1YiA9IFB1YlN1Yjtcbn0iLCJcbi8vIEB0cy1ub2NoZWNrXG5cbi8qKiBAbW9kdWxlIHB1YnN1Yi9zdWJzY3JpcHRpb25zICovXG5cbmltcG9ydCB7XG4gIEdFTkVTWVNfQ09CUk9XU0VfQ09ORklHVVJBVElPTixcbiAgR1dFX1NFTkRfRElTUE9TSVRJT05fQ09ERSxcbiAgTU9OSVRPUklOR0pTX1JFU1BPTlNFLFxuICBNT05JVE9SSU5HX0lEX1JFU1BPTlNFLFxuICBNT05JVE9SSU5HSlNfUkVRVUVTVCxcbiAgTU9OSVRPUklOR19DTEVBUl9IRUFSVEJFQVQsXG4gIFBNX1NFTkRfU0FMRV9PQ0NVUlJFRCxcbiAgR0VORVNZU19RVUFMSUZJRURfTEVBRCxcbiAgR0VORVNZU19TVVNQRU5EX01PTklUT1JJTkcsXG4gIEdFTkVTWVNfUkVRVUVTVF9GRVRDSF9TRVNTSU9OLFxuICBTSVRFX0lORk9fQVZBSUxBQkxFLFxuICBHRU5FU1lTX1JFUVVFU1RfVENfVVBEQVRFLFxuICBURUFMSVVNX1JFQURZX0ZPUl9QVUJTVUIsXG4gIEdFTkVTWVNfUkVRVUVTVF9OQVRJVkVfQ0hBVCxcbiAgR0VORVNZU19TRVRfQUdFTlRfSUQsXG59IGZyb20gXCIuLi93aWRnZXQtY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7IHB1Ymxpc2hXaW5kb3csIHB1Ymxpc2hUZWFsaXVtIH0gZnJvbSBcIi4uL3V0aWxpdGllcy91dGlsaXRpZXNcIjtcblxuaW1wb3J0IGNvbmZpZ3VyZUNvYnJvd3NlIGZyb20gXCIuLi93aWRnZXQtYXBpL2NvbmZpZ3VyZS1jb2Jyb3dzZVwiO1xuaW1wb3J0IGhhbmRsZU1vbml0b3JpbmdSZXNwb25zZSBmcm9tIFwiLi4vc2FsZXMvcmVzcG9uc2VcIjtcbmltcG9ydCB7IHBvc3RDaGF0RGV0YWlscyB9IGZyb20gXCIuL3Bvc3QtbWVzc2FnZXNcIjtcblxuLyoqXG4gKiBTdWJzY3JpYmUgVGVhbGl1bSBhbmQgU3BhcnRhIHdpZGdldCBsb2FkZXIgZXZlbnRzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xuICBjb25zdCB7IHdpZGdldExvYWRlcjogU3BhcnRhUHViU3ViIH0gPSB3aW5kb3cuc3BhcnRhLmNoYXQ7XG4gIFRlYWxpdW1QdWJTdWIuc3Vic2NyaWJlKE1PTklUT1JJTkdfSURfUkVTUE9OU0UsIHB1Ymxpc2hXaW5kb3cpO1xuICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShQTV9TRU5EX1NBTEVfT0NDVVJSRUQsIHB1Ymxpc2hXaW5kb3cpO1xuICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShNT05JVE9SSU5HSlNfUkVTUE9OU0UsIGhhbmRsZU1vbml0b3JpbmdSZXNwb25zZSk7XG5cbiAgVGVhbGl1bVB1YlN1Yi5zdWJzY3JpYmUoU0lURV9JTkZPX0FWQUlMQUJMRSwgcHVibGlzaFdpbmRvdyk7XG4gIFNwYXJ0YVB1YlN1Yi5zdWIoR0VORVNZU19DT0JST1dTRV9DT05GSUdVUkFUSU9OLCBjb25maWd1cmVDb2Jyb3dzZSk7XG5cbiAgU3BhcnRhUHViU3ViLnN1YihcbiAgICBHRU5FU1lTX1JFUVVFU1RfRkVUQ0hfU0VTU0lPTixcbiAgICAoeyBkZXRhaWwgfTogeyBkZXRhaWw6IG9iamVjdCB9KSA9PiB7XG4gICAgICBwdWJsaXNoVGVhbGl1bShHRU5FU1lTX1JFUVVFU1RfRkVUQ0hfU0VTU0lPTiwgZGV0YWlsKTtcbiAgICB9XG4gICk7XG4gIFNwYXJ0YVB1YlN1Yi5zdWIoXG4gICAgR0VORVNZU19SRVFVRVNUX1RDX1VQREFURSxcbiAgICAoeyBkZXRhaWwgfTogeyBkZXRhaWw6IG9iamVjdCB9KSA9PiB7XG4gICAgICBwdWJsaXNoVGVhbGl1bShHRU5FU1lTX1JFUVVFU1RfVENfVVBEQVRFLCBkZXRhaWwpO1xuICAgIH1cbiAgKTtcbiAgU3BhcnRhUHViU3ViLnN1YihcbiAgICBHRU5FU1lTX1JFUVVFU1RfTkFUSVZFX0NIQVQsXG4gICAgKHsgZGV0YWlsIH06IHsgZGV0YWlsOiBvYmplY3QgfSkgPT4ge1xuICAgICAgcHVibGlzaFRlYWxpdW0oR0VORVNZU19SRVFVRVNUX05BVElWRV9DSEFULCBkZXRhaWwpO1xuICAgIH1cbiAgKTtcbiAgU3BhcnRhUHViU3ViLnN1YihNT05JVE9SSU5HX0NMRUFSX0hFQVJUQkVBVCwgKCkgPT5cbiAgICBwdWJsaXNoVGVhbGl1bShNT05JVE9SSU5HX0NMRUFSX0hFQVJUQkVBVClcbiAgKTtcblxuICBTcGFydGFQdWJTdWIuc3ViKFxuICAgIEdFTkVTWVNfU0VUX0FHRU5UX0lELFxuICAgIChlOiB7IHR5cGU6IHN0cmluZzsgZGV0YWlsOiBvYmplY3QgfCBzdHJpbmcgfSkgPT4ge1xuICAgICAgcG9zdENoYXREZXRhaWxzKGUudHlwZSwgZS5kZXRhaWwpO1xuICAgIH1cbiAgKTtcbiAgaWYgKHdpbmRvdy5kaWdpdGFsRGF0YSAmJiAhd2luZG93LmRpZ2l0YWxEYXRhLm9uX2ludGVybmFsX3BhZ2UpIHtcbiAgICBTcGFydGFQdWJTdWIuc3ViKEdFTkVTWVNfUVVBTElGSUVEX0xFQUQsICh7IGRldGFpbCB9OiB7IGRldGFpbDogb2JqZWN0IH0pID0+XG4gICAgICBwdWJsaXNoVGVhbGl1bShHRU5FU1lTX1FVQUxJRklFRF9MRUFELCBkZXRhaWwpXG4gICAgKTtcblxuICAgIFNwYXJ0YVB1YlN1Yi5zdWIoTU9OSVRPUklOR0pTX1JFUVVFU1QsICh7IGRldGFpbCB9OiB7IGRldGFpbDogb2JqZWN0IH0pID0+XG4gICAgICBwdWJsaXNoVGVhbGl1bShNT05JVE9SSU5HSlNfUkVRVUVTVCwgZGV0YWlsKVxuICAgICk7XG5cbiAgICBTcGFydGFQdWJTdWIuc3ViKFxuICAgICAgR1dFX1NFTkRfRElTUE9TSVRJT05fQ09ERSxcbiAgICAgICh7IGRldGFpbCB9OiB7IGRldGFpbDogb2JqZWN0IH0pID0+XG4gICAgICAgIHB1Ymxpc2hUZWFsaXVtKEdXRV9TRU5EX0RJU1BPU0lUSU9OX0NPREUsIGRldGFpbClcbiAgICApO1xuXG4gICAgU3BhcnRhUHViU3ViLnN1YihHRU5FU1lTX1NVU1BFTkRfTU9OSVRPUklORywgKCkgPT5cbiAgICAgIHB1Ymxpc2hUZWFsaXVtKEdFTkVTWVNfU1VTUEVORF9NT05JVE9SSU5HKVxuICAgICk7XG4gIH1cbiAgU3BhcnRhUHViU3ViLnB1YihURUFMSVVNX1JFQURZX0ZPUl9QVUJTVUIsIHt9KTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwiLy8gQHRzLW5vY2hlY2tcbi8qKiBAbW9kdWxlIHB1YnN1Yi93aWRnZXQtc2NyaXB0LWxvYWRlZCAqL1xuXG5pbXBvcnQge1xuICBlcnJvckxvYWRpbmdXaWRnZXQsXG4gIFNQQVJUQV9XSURHRVRfUkVBRFksXG4gIENIQVRfSU5JVElBTElaQVRJT04sXG4gIFdJREdFVF9SRVFVRVNUX0NPTkZJR1VSQVRJT04sXG4gIFdJREdFVF9SRVFVRVNUX0NPTkZJR1VSQVRJT05fRVJST1IsXG4gIFdJREdFVF9SRVFVRVNUX0NPTkZJR1VSQVRJT05fU1VDQ0VTU0ZVTCxcbn0gZnJvbSAnLi4vd2lkZ2V0LWNvbnN0YW50cyc7XG5cbmltcG9ydCBkb2N1bWVudEV2ZW50cyBmcm9tICcuLi9ldmVudHMnO1xuaW1wb3J0IHtcbiAgaXNWNixcbiAgZ2V0VjZXaWRnZXRDb25maWcsXG4gIGxvZ0dlbmVzeXNFdmVudCxcbn0gZnJvbSAnLi4vdXRpbGl0aWVzL3V0aWxpdGllcyc7XG5cbi8qKlxuICogT25jZSB3aWRnZXQgY29uZmlndXJhdGlvbiBsb2FkLCBmaXJlcyBvbiBzdWNjZXNzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB1Ymxpc2hXaWRnZXRDb25maWd1cmF0aW9uU3VjY2VzcygpIHtcbiAgVGVhbGl1bVB1YlN1Yi5wdWJsaXNoKFdJREdFVF9SRVFVRVNUX0NPTkZJR1VSQVRJT05fU1VDQ0VTU0ZVTCwge30pO1xuICBsb2dHZW5lc3lzRXZlbnQoMSwgJ1dpZGdldCBDb25maWd1cmF0aW9uIFJlc3BvbnNlJywgYHB1Ymxpc2hpbmcgJHtXSURHRVRfUkVRVUVTVF9DT05GSUdVUkFUSU9OX1NVQ0NFU1NGVUx9YCk7XG59XG5cbi8qKlxuICogT25jZSB3aWRnZXQgY29uZmlndXJhdGlvbiBsb2FkLCBmaXJlcyBvbiBlcnJvclxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdWJsaXNoV2lkZ2V0Q29uZmlndXJhdGlvbkVycm9yKCkge1xuICBUZWFsaXVtUHViU3ViLnB1Ymxpc2goV0lER0VUX1JFUVVFU1RfQ09ORklHVVJBVElPTl9FUlJPUiwge30pO1xuICBsb2dHZW5lc3lzRXZlbnQoMywgJ1dpZGdldCBDb25maWd1cmF0aW9uIFJlc3BvbnNlJywgYHB1Ymxpc2hpbmcgJHtXSURHRVRfUkVRVUVTVF9DT05GSUdVUkFUSU9OX0VSUk9SfWApO1xufVxuXG4vKipcbiAqIFN1YnNjcmliZXMgd2lkZ2V0IGNvbmZpZ3VyYXRpb24gZXZlbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBuYW1lIG9mIGV2ZW50XG4gKiBAcGFyYW0ge29iamVjdH0gd2lkZ2V0Q29uZmlndXJhdGlvbiAtIFdpZGdldCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJzY3JpYmVXaWRnZXRDb25maWd1cmF0aW9uKGV2ZW50TmFtZTogc3RyaW5nLCB3aWRnZXRDb25maWd1cmF0aW9uOiBvYmplY3QpOiBib29sZWFuIHtcbiAgY29uc3QgdjYgPSBpc1Y2KCk7XG4gIGlmICghdjYpIHtcbiAgICBsb2FkTGVnYWN5Q2hhdCh7IHdpZGdldENvbmZpZ3VyYXRpb24gfSk7XG4gIH1cbiAgZWxzZSB7XG4gICAgd2lkZ2V0Q29uZmlndXJhdGlvbiA9IGdldFY2V2lkZ2V0Q29uZmlnKCk7XG4gICAgbG9hZFY2Q2hhdCh7IHdpZGdldENvbmZpZ3VyYXRpb24gfSk7XG4gIH1cbiAgbG9nR2VuZXN5c0V2ZW50KDEsICdXaWRnZXQgQ29uZmlndXJhdGlvbicsIHdpZGdldENvbmZpZ3VyYXRpb24pO1xuICByZXR1cm4gZmFsc2U7XG59XG5cblxuXG5leHBvcnQgY29uc3QgbG9hZFY2Q2hhdCA9ICh7IHdpZGdldENvbmZpZ3VyYXRpb24gfTogeyB3aWRnZXRDb25maWd1cmF0aW9uOiBhbnkgfSkgPT4ge1xuICBjb25zdCBsb2FkZXJWZXJzaW9uID0gd2lkZ2V0Q29uZmlndXJhdGlvbi5sb2FkZXJWZXJzaW9uO1xuICBjb25zdCB2NkNvbmZpZyA9IGdldFY2V2lkZ2V0Q29uZmlnKCk7XG4gIHY2Q29uZmlnLm9wdGlvbnMub25FcnJvciA9ICgpID0+IHtcbiAgICBUZWFsaXVtUHViU3ViLnB1Ymxpc2goV0lER0VUX1JFUVVFU1RfQ09ORklHVVJBVElPTl9FUlJPUiwge30pO1xuICAgIGNvbnNvbGUubG9nKFwib25FcnJvclwiKTtcbiAgfTtcbiAgdjZDb25maWcub3B0aW9ucy5vbkxvYWQgPSAoKSA9PiB7XG4gICAgVGVhbGl1bVB1YlN1Yi5wdWJsaXNoKFdJREdFVF9SRVFVRVNUX0NPTkZJR1VSQVRJT05fU1VDQ0VTU0ZVTCwge30pO1xuICAgIGNvbnNvbGUubG9nKFwib25Mb2FkXCIpO1xuICB9O1xuICB3aW5kb3cuc3BhcnRhLndpZGdldExvYWRlcltsb2FkZXJWZXJzaW9uXS5sb2FkKHY2Q29uZmlnKTtcbn07XG5cblxuZXhwb3J0IGNvbnN0IGxvYWRMZWdhY3lDaGF0ID0gKHsgd2lkZ2V0Q29uZmlndXJhdGlvbiB9OiB7IHdpZGdldENvbmZpZ3VyYXRpb246IG9iamVjdCB9KSA9PiB7XG4gIHdpbmRvdy5zcGFydGEuY2hhdC53aWRnZXRMb2FkZXIubG9hZCh3aWRnZXRDb25maWd1cmF0aW9uKTtcbiAgd2luZG93LnNwYXJ0YS5jaGF0LndpZGdldExvYWRlci5zdWIoXG4gICAgZXJyb3JMb2FkaW5nV2lkZ2V0LFxuICAgIHB1Ymxpc2hXaWRnZXRDb25maWd1cmF0aW9uRXJyb3JcbiAgKTtcbiAgd2luZG93LnNwYXJ0YS5jaGF0LndpZGdldExvYWRlci5zdWIoXG4gICAgU1BBUlRBX1dJREdFVF9SRUFEWSxcbiAgICBwdWJsaXNoV2lkZ2V0Q29uZmlndXJhdGlvblN1Y2Nlc3NcbiAgKTtcbn07XG5cbi8qKlxuICogUHVibGlzaCBjaGF0IGluaXRpYWxpemF0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB1Ymxpc2hDaGF0SW5pdGlhbGl6YXRpb24oKTogYm9vbGVhbiB7XG4gIFRlYWxpdW1QdWJTdWIucHVibGlzaChDSEFUX0lOSVRJQUxJWkFUSU9OLCB7fSk7XG4gIGxvZ0dlbmVzeXNFdmVudCgxLCAnQ2hhdCBJbml0aWFsaXphdGlvbicsIGBwdWJsaXNoaW5nICR7Q0hBVF9JTklUSUFMSVpBVElPTn1gKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIERvY3VtZW50IHNldCBldmVudCwgc3BhcnRhIGV2ZW50IGZpcmVkLlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGFydGFMb2FkZXJMb2FkZWRFdmVudCgpOiBib29sZWFuIHtcbiAgZG9jdW1lbnRFdmVudHMoKTtcbiAgcHVibGlzaENoYXRJbml0aWFsaXphdGlvbigpO1xuICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShXSURHRVRfUkVRVUVTVF9DT05GSUdVUkFUSU9OLCBzdWJzY3JpYmVXaWRnZXRDb25maWd1cmF0aW9uKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIE9uY2Ugd2lkZ2V0IHNjcmlwdCBoYXMgbG9hZGVkIFwic3BhcnRhTG9hZGVyTG9hZGVkIGV2ZW50IHdpbGxcbiAqIGZpcmVcIiBFdmVudCB3aWxsIGZpcmUgY2FsbGJhY2sgXCJzcGFydGFMb2FkZXJMb2FkZWRFdmVudFwiXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCk6IGJvb2xlYW4ge1xuICBpZiAod2luZG93LnNwYXJ0YSAmJiB3aW5kb3cuc3BhcnRhLmNoYXQgJiYgd2luZG93LnNwYXJ0YS5jaGF0LndpZGdldExvYWRlcikge1xuICAgIHNwYXJ0YUxvYWRlckxvYWRlZEV2ZW50KCk7XG4gIH0gZWxzZSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhdC5zcGFydGFMb2FkZXJMb2FkZWQnLCBzcGFydGFMb2FkZXJMb2FkZWRFdmVudCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwiLyoqIEBtb2R1bGUgcHVic3ViL3dpZGdldC1zY3JpcHQgKi9cbmltcG9ydCB7XG4gIGdldERvbWFpbixcbiAgaXNWNixcbiAgbG9nR2VuZXN5c0V2ZW50LFxufSBmcm9tICcuLi91dGlsaXRpZXMvdXRpbGl0aWVzJztcblxuXG5cbi8qKlxuICogQ3JlYXRlIGEgc2NyaXB0IHRhZywgd2lkZ2V0IGxvYWRlciB2ZXJzaW9uIGNhbiBjaGFuZ2UuIFNldCB0eXBlIGFuZCBzcmNcbiAqIGF0dHJpYnV0ZS4gSWYgbG9jYWxob3N0IHwgc2V0IHRvIGxvY2FsaG9zdDozMDA1ICh3aWRnZXQncyBkZWZhdWx0IGxvY2FsaG9zdCkuXG4gKiBBcHBlbmQgbG9hZGVyIHRvIGJvZHkuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCk6IGJvb2xlYW4ge1xuICBjb25zdCBkb21haW4gPSBnZXREb21haW4oKTtcbiAgY29uc3QgdjYgPSBpc1Y2KCk7XG4gIC8vIFBvbHlmaWxscyBzY3JpcHRcbiAgbG9nR2VuZXN5c0V2ZW50KDEsICdQb2x5ZmlsbFNjcmlwdCcsICdjcmVhdGluZyBCYWJlbCBQb2x5ZmlsbHMgU2NyaXB0Jyk7XG5cbiAgaWYgKCF2Nikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB2dGltUG9seWZpbGxzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICB2dGltUG9seWZpbGxzLmlkID0gJ3Z0aW0tcG9seWZpbGwtc2NyaXB0JztcbiAgICAgIGNvbnN0IHZ0aW1Qb2x5ZmlsbHNFbmRwb2ludCA9ICcvc3BhL3dpZGdldHMvd3d3LWNoYXQvMy4wLjAvc3BhLWFzc2V0cy9jb21wb25lbnRzL3V0aWxpdGllcy9wbGF0Zm9ybS9iYWJlbC1wb2x5ZmlsbC5qcz9fPScgKyBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdnRpbVBvbHlmaWxsc1VSTCA9IGRvbWFpbiArIHZ0aW1Qb2x5ZmlsbHNFbmRwb2ludDtcbiAgICAgIHZ0aW1Qb2x5ZmlsbHMuc3JjID0gdnRpbVBvbHlmaWxsc1VSTDtcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodnRpbVBvbHlmaWxscyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coZSlcbiAgICB9XG4gIH1cbiAgbG9nR2VuZXN5c0V2ZW50KDEsICdXaWRnZXRTY3JpcHQnLCAnY3JlYXRpbmcgV2lkZ2V0IFNjcmlwdCcpO1xuICBjb25zdCBsb2FkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgbG9hZGVyLmlkID0gJ2xvYWRlci1zY3JpcHQnO1xuICBsb2FkZXIuZGF0YXNldC53aWRnZXROYW1lID0gJ2NoYXQnO1xuICBjb25zdCB3aWRnZXRTY3JpcHRVUkkgPSAnL3NwYS93aWRnZXRzL2xvYWRlci8zLjAuMS9pbmRleC5qcyc7XG4gIGxvYWRlci50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gIGxvYWRlci5zcmMgPSBgJHtkb21haW59JHt3aWRnZXRTY3JpcHRVUkl9YDtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsb2FkZXIpO1xuICByZXR1cm4gZmFsc2U7XG59XG4iLCIvLyBAdHMtbm9jaGVja1xuXG4vKiogQG1vZHVsZSB3aWRnZXQtbG9hZGVyL3NhbGVzL2ZldGNoLXNlc3Npb24gKi9cblxuaW1wb3J0IGZldGNoV2l0aFJldHJ5IGZyb20gXCIuLi91dGlsaXRpZXMvZmV0Y2gtd2l0aC1yZXRyeVwiO1xuaW1wb3J0IHsgZ2V0Q3VycmVudERvbWFpbiwgaW5jcmVhc2VFcnJvckNvdW50LCBsb2dHZW5lc3lzRXZlbnQsIHB1Ymxpc2hXaW5kb3cgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3V0aWxpdGllc1wiO1xuaW1wb3J0IHsgY2hhdFNpdGVQYXJhbXMsIEdFTkVTWVNfRkVUQ0hfU0VTU0lPTl9FTkRQT0lOVCwgR0VORVNZU19SRVFVRVNUX0ZFVENIX1NFU1NJT05fRkFJTFVSRSwgR0VORVNZU19SRVFVRVNUX0ZFVENIX1NFU1NJT05fU1VDQ0VTUywgR0VORVNZU19SRVFVRVNUX05BVElWRV9DSEFULCBQSVhFTF9UQUdfVVJMLCBTSVRFX0lORk9fQVZBSUxBQkxFIH0gZnJvbSBcIi4uL3dpZGdldC1jb25zdGFudHNcIjtcbmltcG9ydCBnZXRDb29raWVTdG9yYWdlIGZyb20gXCIuLi91dGlsaXRpZXMvZ2V0LWNvb2tpZVwiO1xuaW1wb3J0IG1vYmlsZUFDU0xvZ2dlclNlcnZpY2UgZnJvbSBcIi4uL3V0aWxpdGllcy9sb2dnZXJcIjtcbi8qKlxuICogRXJyb3IgZmV0Y2hSZWZTZXNzaW9uIEV2ZW50XG4gKiBAcGFyYW0ge29iamVjdH0gcmVzcG9uc2UgLSBFcnJvciByZXNwb25zZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvckZldGNoU2Vzc2lvbkV2ZW50KHJlc3BvbnNlOiBvYmplY3QpIHtcbiAgcHVibGlzaFdpbmRvdyhHRU5FU1lTX1JFUVVFU1RfRkVUQ0hfU0VTU0lPTl9GQUlMVVJFLCByZXNwb25zZSk7XG4gIGlmIChiYWN0bSAmJiBiYWN0bS5wbHVnaW5zICYmIGJhY3RtLnBsdWdpbnMucGl4ZWxUYWcpIHtcbiAgICBiYWN0bS5wbHVnaW5zLnBpeGVsVGFnLmZpcmVQaXhlbFRhZyhgJHtQSVhFTF9UQUdfVVJMfT9lcnJvcj0ke3Jlc3BvbnNlfWApO1xuICB9XG4gIGxvZ0dlbmVzeXNFdmVudCgzLCAnR2VuZXN5cyBSZXF1ZXN0IEZldGNoIFNlc3Npb24gRmFpbHVyZScsIHJlc3BvbnNlKTtcbiAgbW9iaWxlQUNTTG9nZ2VyU2VydmljZSgnZ2V0UmVmSWRJbmZvJywgcmVzcG9uc2UpO1xuICBpbmNyZWFzZUVycm9yQ291bnQoKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG4gKiBTdWNjZXNzIGZldGNoUmVmU2Vzc2lvbiBFdmVudFxuICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIC0gU3VjY2VzcyByZXNwb25zZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKlxuICogc3VjY2VzcyByZXNwb25zZVxuICoge1xuICogICBhZ2VudElEOiBcIjZIOThGTUdCN1Q3RVA5RTNWRjZRVkVERzNTMDAwMERGXCIsXG4gKiAgIGNoYXRJRDogXCJBMUQzU0ZBM0pFNTQxMjM0QTNENTY3RjhBOTEwXCJcbiAqICB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWNjZXNzRmV0Y2hTZXNzaW9uRXZlbnQocmVzcG9uc2U6IHsgQUdFTlRfSUQ/OiBzdHJpbmcsIENIQVRfSUQ/OiBzdHJpbmcgfSkge1xuICAvLyBzZXRzIGZsYWcgdG8gdHJ1ZVxuICBjb25zdCBjdXJyZW50V2ViUGFnZSA9IHdpbmRvdy5kb2N1bWVudC50aXRsZVxuICBjb25zdCBhZ2VudExUUyA9IGJhY3RtLlN0b3JlKCdjaGF0JywgeyB0eXBlOiAnY29va2llJyB9KTtcbiAgLy8gdGhpcyBzZXRzIGJhY3RtX2x0cyBjb29raWUgY2VydGFpbiBzYWxlcyBmbG93IGNoZWNrIHRoZSBiYWN0bV9sdHMgY29va2llIHJhdGhlciB0aGFuIHRoZSBvY2N0Q2hhdF9sdHMgY29va2llXG4gIGFnZW50TFRTLnNldCgnc2VjdXJlQWdlbnRJRCcsIHJlc3BvbnNlPy5BR0VOVF9JRCk7XG4gIGFnZW50TFRTLnNhdmUoKTtcbiAgcHVibGlzaFdpbmRvdyhHRU5FU1lTX1JFUVVFU1RfRkVUQ0hfU0VTU0lPTl9TVUNDRVNTLCByZXNwb25zZSk7XG4gIHB1Ymxpc2hXaW5kb3coR0VORVNZU19SRVFVRVNUX05BVElWRV9DSEFULCB7IGN1cnJlbnRXZWJQYWdlLCAuLi5yZXNwb25zZSB9KVxuICBsb2dHZW5lc3lzRXZlbnQoMSwgJ0dlbmVzeXMgUmVxdWVzdCBGZXRjaCBTZXNzaW9uIFN1Y2Nlc3MnLCByZXNwb25zZSk7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBNYWtlcyBmZXRjaFNlc3Npb24gcmVxdWVzdFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIG5hbWUgb2YgZXZlbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWZJRCAtIHJlZmVyZW5jZSBJRCAtIERldmljZSBJRCAoR1VJRClcbiAqIEBwYXJhbSB7c3RyaW5nfSB0cmFjZUlEIC0gdHJhY2UgSUQgLSBhbGxvd3MgZm9yIGRlYnVnZ2luZyBhbmQgc2Vzc2lvbiB0cmFja2luZyBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGV2ZW50OiBzdHJpbmcsIHJlZklEOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBpZiAodHlwZW9mIGJhY3RtID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGZXRjaCBSZXF1ZXN0OiBCYWN0bSBub3QgZGVmaW5lZCcpXG4gICAgfTtcblxuICAgIGNvbnN0IGJhY3RtTHRzQ29va2llID0gZ2V0Q29va2llU3RvcmFnZSgnYmFjdG1fbHRzJyk7XG4gICAgY29uc3Qgc2FsZXNSbGQgPSBiYWN0bUx0c0Nvb2tpZT8uY2hhdFNlcnZpY2U/LlJMRD8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnc2FsZXMnKTtcbiAgICBjb25zdCBzZWN1cmVBZ2VudElEID0gYmFjdG1MdHNDb29raWU/LmNoYXQ/LnNlY3VyZUFnZW50SUQ7XG5cbiAgICAvLyBjaGVja2luZyBpZiB3ZSBoYXZlIGFuIGFnZW50SWQgYW5kIGlmIHJsZCBpcyBzYWxlcywgaWYgd2UgaGF2ZSBib3RoIGRvbid0IGZpcmUgcmVmSWQgY2FsbFxuICAgIGlmIChzYWxlc1JsZCAmJiBzZWN1cmVBZ2VudElEKSB7XG4gICAgICBjb25zb2xlLmxvZygnVGhlIEdldFJlZklESW5mbyBlbmRwb2ludCB3aWxsIG5vdCBiZSBjYWxsZWQgYmVjYXVzZSB3ZSBhbHJlYWR5IGhhdmUgYW4gYWdlbnRJRCcpXG4gICAgICAvLyByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFRMRCA9IGdldEN1cnJlbnREb21haW4oKTtcbiAgICBjb25zdCBmZXRjaFJlZklEUGFyYW1zID0ge1xuICAgICAgX0NIQVRfUkVGX0lEOiByZWZJRCxcbiAgICAgIF9UUkFDRV9JRDogbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICB9XG4gICAgbG9nR2VuZXN5c0V2ZW50KDEsICdGZXRjaCBTZXNzaW9uIFJlcXVlc3QgcGFyYW1zJywgZmV0Y2hSZWZJRFBhcmFtcyk7XG4gICAgXG4gICAgY29uc3QgZmlyZVJlZklEQ2hlY2sgPSAoZXZlbnQ6IHN0cmluZywgY2hhdFNpdGVEb21haW5zOiBvYmplY3QpID0+IHtcbiAgICAgIGxvZ0dlbmVzeXNFdmVudCgxLCAnRmlyaW5nIHJlZklEIGZldGNoJywgY2hhdFNpdGVEb21haW5zKVxuICAgICAgY29uc3QgZ2VuZXN5c0ZldGNoU2Vzc2lvbkVuZHBvaW50VVJMID1gJHtjaGF0U2l0ZURvbWFpbnNbY3VycmVudFRMRF0uZ2VuZXN5c30ke0dFTkVTWVNfRkVUQ0hfU0VTU0lPTl9FTkRQT0lOVH1gO1xuICAgICAgZmV0Y2hXaXRoUmV0cnkoZ2VuZXN5c0ZldGNoU2Vzc2lvbkVuZHBvaW50VVJMLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShmZXRjaFJlZklEUGFyYW1zKSxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgfSxcbiAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJ1xuICAgICAgfSkudGhlbihzdWNjZXNzRmV0Y2hTZXNzaW9uRXZlbnQpLmNhdGNoKGVycm9yRmV0Y2hTZXNzaW9uRXZlbnQpO1xuICAgIH1cbiAgICAgIC8vIGlmIGNoYXRTaXRlIHBhcmFtcyBoYXZlIG5vdCBiZWVuIHJlY2VpdmVkXG4gICAgaWYgKCFjaGF0U2l0ZVBhcmFtcy5zcGFQYXJhbXMpIHtcbiAgICAgIC8vIHdhaXQgZm9yIFNJVEVfSU5GT19BVkFJTEFCTEUgZXZlbnQsIHRoZW4gZmlyZSBmZXRjaCByZXF1ZXN0XG4gICAgICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShTSVRFX0lORk9fQVZBSUxBQkxFLCBmaXJlUmVmSURDaGVjaylcbiAgICAgIGxvZ0dlbmVzeXNFdmVudCgxLCAnU3Vic2NyaWJpbmcgdG8gU0lURV9JTkZPX0FWQUlMQUJMRScsIHt9KVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmaXJlIGZldGNoIHJlcXVlc3RcbiAgICAgIGZpcmVSZWZJRENoZWNrKFNJVEVfSU5GT19BVkFJTEFCTEUsIGNoYXRTaXRlUGFyYW1zLnNwYVBhcmFtcylcbiAgICAgIGxvZ0dlbmVzeXNFdmVudCgxLCAnRmV0Y2hpbmcgUmVmSUQnLCB7fSlcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dHZW5lc3lzRXZlbnQoMywgJ0ZldGNoIFNlc3Npb24gRXJyb3InLCBlKTtcbiAgICBpbmNyZWFzZUVycm9yQ291bnQoKTtcbiAgfVxufSIsIi8vIEB0cy1ub2NoZWNrXG5cbi8qKiBAbW9kdWxlIHNhbGVzL2dlbmVzeXMtZGF0YS5qcyAqL1xuaW1wb3J0IHsgd2hpY2hEb21haW4sIGlzRW1wdHlBcnIsIGlzRW1wdHlPYmogfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3V0aWxpdGllc1wiO1xuaW1wb3J0IHsgTUVSUklMTCwgSU5URVJOQUwgfSBmcm9tIFwiLi4vd2lkZ2V0LWNvbnN0YW50c1wiO1xuXG5mdW5jdGlvbiBfcHJlcGFyZURhdGEoZGRvOiBhbnkpIHtcbiAgY29uc3QgZGRvQ2hhdERhdGEgPVxuICAgIGJhY3RtICYmXG4gICAgYmFjdG0ucG9seWZpbGxzICYmXG4gICAgYmFjdG0ucG9seWZpbGxzLm9iamVjdC5leGlzdHMoZGlnaXRhbERhdGEsIFwicGFnZS5hdHRyaWJ1dGVzLmNoYXRcIilcbiAgICAgID8gZGRvLnBhZ2UuYXR0cmlidXRlcy5jaGF0XG4gICAgICA6IHt9O1xuICBjb25zdCBnZW5lc3lzRGF0YUZuID0ge1xuICAgIHNpdGVJZDogKCkgPT4ge1xuICAgICAgd2luZG93LmlucVNpdGVJRCA9IGRkb0NoYXREYXRhLnNpdGVfaWQgfHwgZGRvQ2hhdERhdGEuU0lURV9JRCB8fCBudWxsO1xuICAgICAgcmV0dXJuIHdpbmRvdy5pbnFTaXRlSUQ7XG4gICAgfSxcbiAgICBsYW5ndWFnZTogKGRhdGE6IHtcbiAgICAgIHBhZ2U6IHtcbiAgICAgICAgcGFnZUluZm86IHN0cmluZyB8IGFueVtdO1xuICAgICAgICBhdHRyaWJ1dGVzOiB7IGNoYXQ6IHsgTEFOR1VBR0U6IGFueSB9IH07XG4gICAgICB9O1xuICAgIH0pID0+IHtcbiAgICAgIGxldCBsYW5ndWFnZSA9XG4gICAgICAgIGRhdGEucGFnZSAmJlxuICAgICAgICBkYXRhLnBhZ2UucGFnZUluZm8gJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheShkYXRhLnBhZ2UucGFnZUluZm8pICYmXG4gICAgICAgIGRhdGEucGFnZS5wYWdlSW5mby5sZW5ndGggPiAwXG4gICAgICAgICAgPyBkYXRhLnBhZ2UucGFnZUluZm9bMF0ubGFuZ3VhZ2VcbiAgICAgICAgICA6IFwiXCI7XG5cbiAgICAgIGlmIChcbiAgICAgICAgbGFuZ3VhZ2UgPT09IFwiXCIgJiZcbiAgICAgICAgdHlwZW9mIGZzZE5hdkNsaWVudE9wdGlvbnMgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgZnNkTmF2Q2xpZW50T3B0aW9uc1xuICAgICAgKSB7XG4gICAgICAgIGxhbmd1YWdlID0gZnNkTmF2Q2xpZW50T3B0aW9ucy5sb2NhbGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgbGFuZ3VhZ2UgPT09IFwiXCIgJiZcbiAgICAgICAgZGF0YS5wYWdlICYmXG4gICAgICAgIGRhdGEucGFnZS5hdHRyaWJ1dGVzICYmXG4gICAgICAgIGRhdGEucGFnZS5hdHRyaWJ1dGVzLmNoYXRcbiAgICAgICkge1xuICAgICAgICBsYW5ndWFnZSA9IGRhdGEucGFnZS5hdHRyaWJ1dGVzLmNoYXQuTEFOR1VBR0U7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGFuZ3VhZ2U7XG4gICAgfSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgICBkaXNhYmxlQ2hhdDogKCkgPT4ge1xuICAgICAgaWYgKHdpbmRvdy5iYWN0bSkge1xuICAgICAgICBjb25zdCBjb29raWVzID0gbmV3IHdpbmRvdy5iYWN0bS5Db29raWVzKCk7XG4gICAgICAgIGNvbnN0IG1sbyA9IGNvb2tpZXMuZ2V0KFwiYm9hX2hsdHNfbWxvXCIpO1xuXG4gICAgICAgIGNvbnN0IHFzID0gbmV3IHdpbmRvdy5iYWN0bS5RdWVyeVN0cmluZygpO1xuICAgICAgICBjb25zdCBhZmZpbGlhdGVDb2RlID0gcXMuZ2V0KFwiYWZmaWxpYXRlY29kZVwiKTtcblxuICAgICAgICByZXR1cm4gISEobWxvIHx8IGFmZmlsaWF0ZUNvZGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgT0lEOiAoZGF0YTogeyB1c2VyOiB7IG9ubGluZV9pZDogYW55IH0gfSkgPT5cbiAgICAgIGRhdGEudXNlciA/IGRhdGEudXNlci5vbmxpbmVfaWQgOiBcIlwiLFxuXG4gICAgYXV0aGVudGljYXRlZDogKGRhdGE6IHsgdXNlcjogeyBhdXRoZW50aWNhdGVkOiBhbnkgfSB9KSA9PiB7XG4gICAgICBjb25zdCBhdXRoZW50aWNhdGVkID0gZGF0YT8udXNlcj8uYXV0aGVudGljYXRlZFxuICAgICAgICA/IGRhdGEudXNlci5hdXRoZW50aWNhdGVkXG4gICAgICAgIDogZmFsc2U7XG4gICAgICByZXR1cm4gYXV0aGVudGljYXRlZDtcbiAgICB9LFxuICAgIGJ1aWxkTmFtZTogKFxuICAgICAgZGF0YTogeyB1c2VyOiB7IG5hbWU6IHsgZmlyc3Q6IHN0cmluZzsgbGFzdDogc3RyaW5nOyBmdWxsOiBzdHJpbmcgfSB9IH0sXG4gICAgICBmaWx0ZXI6IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgbGV0IGZpcnN0TmFtZSA9IFwiXCI7XG4gICAgICBsZXQgbGFzdE5hbWUgPSBcIlwiO1xuICAgICAgbGV0IGZ1bGxOYW1lID0gXCJcIjtcblxuICAgICAgaWYgKGRhdGEudXNlciAmJiBkYXRhLnVzZXIubmFtZSkge1xuICAgICAgICBmaXJzdE5hbWUgPSBkYXRhLnVzZXIubmFtZS5maXJzdCB8fCBcIlwiO1xuICAgICAgICBsYXN0TmFtZSA9IGRhdGEudXNlci5uYW1lLmxhc3QgfHwgXCJcIjtcbiAgICAgICAgZnVsbE5hbWUgPSBkYXRhLnVzZXIubmFtZS5mdWxsIHx8IFwiXCI7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZmlsdGVyKSB7XG4gICAgICAgIGNhc2UgXCJmaXJzdFwiOlxuICAgICAgICAgIGlmIChmaXJzdE5hbWUgPT09IFwiXCIgJiYgbGFzdE5hbWUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmdWxsTmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTtcblxuICAgICAgICBjYXNlIFwibGFzdFwiOlxuICAgICAgICAgIHJldHVybiBsYXN0TmFtZTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmdWxsTmFtZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZmlyc3ROYW1lOiAoZGF0YToge1xuICAgICAgdXNlcjogeyBuYW1lOiB7IGZpcnN0OiBzdHJpbmc7IGxhc3Q6IHN0cmluZzsgZnVsbDogc3RyaW5nIH0gfTtcbiAgICB9KSA9PiBnZW5lc3lzRGF0YUZuLmJ1aWxkTmFtZShkYXRhLCBcImZpcnN0XCIpLFxuXG4gICAgbGFzdE5hbWU6IChkYXRhOiB7XG4gICAgICB1c2VyOiB7IG5hbWU6IHsgZmlyc3Q6IHN0cmluZzsgbGFzdDogc3RyaW5nOyBmdWxsOiBzdHJpbmcgfSB9O1xuICAgIH0pID0+IGdlbmVzeXNEYXRhRm4uYnVpbGROYW1lKGRhdGEsIFwibGFzdFwiKSxcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICAgIGZpcnN0T2ZmZXI6IChkYXRhOiB7IHVzZXI6IHsgb2ZmZXJzOiBzdHJpbmcgfCBhbnlbXSB9IH0sIHR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGRhdGEudXNlciAmJiBkYXRhLnVzZXIub2ZmZXJzICYmIGRhdGEudXNlci5vZmZlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IG9mZmVyaWQgaW4gZGF0YS51c2VyLm9mZmVyc1swXSkge1xuICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcImlkXCI6XG4gICAgICAgICAgICAgIHJldHVybiBvZmZlcmlkO1xuICAgICAgICAgICAgY2FzZSBcImNvZGVcIjpcbiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEudXNlci5vZmZlcnNbMF1bb2ZmZXJpZF07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGZpcnN0T2ZmZXJJZDogKGRhdGE6IHsgdXNlcjogeyBvZmZlcnM6IHN0cmluZyB8IGFueVtdIH0gfSkgPT5cbiAgICAgIGdlbmVzeXNEYXRhRm4uZmlyc3RPZmZlcihkYXRhLCBcImlkXCIpLFxuXG4gICAgZmlyc3RPZmZlckNvZGU6IChkYXRhOiB7IHVzZXI6IHsgb2ZmZXJzOiBzdHJpbmcgfCBhbnlbXSB9IH0pID0+XG4gICAgICBnZW5lc3lzRGF0YUZuLmZpcnN0T2ZmZXIoZGF0YSwgXCJjb2RlXCIpLFxuXG4gICAgc3RhdGU6IChkYXRhOiB7IHVzZXI6IHsgc3RhdGU6IGFueSB9IH0pID0+XG4gICAgICBkYXRhLnVzZXIgPyBkYXRhLnVzZXIuc3RhdGUgOiBcIlwiLFxuXG4gICAgcHJvZHVjdE5hbWU6IChkYXRhOiB7IHByb2R1Y3Q6IHN0cmluZyB8IGFueVtdIH0pID0+IHtcbiAgICAgIGlmICghZGF0YS5wcm9kdWN0IHx8ICFBcnJheS5pc0FycmF5KGRhdGEucHJvZHVjdCkpIHJldHVybiBcIlwiO1xuXG4gICAgICBjb25zdCBwcm9kdWN0TmFtZXMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5wcm9kdWN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHByb2R1Y3ROYW1lcy5wdXNoKGRhdGEucHJvZHVjdFtpXS5wcm9kdWN0SW5mby5wcm9kdWN0TmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9kdWN0TmFtZXMuam9pbihcIixcIik7XG4gICAgfSxcblxuICAgIGNhdGVnb3JpZXM6IChkYXRhOiB7IHByb2R1Y3Q6IHN0cmluZyB8IGFueVtdIH0pID0+IHtcbiAgICAgIGlmICghZGF0YS5wcm9kdWN0IHx8ICFBcnJheS5pc0FycmF5KGRhdGEucHJvZHVjdCkpIHJldHVybiBcIlwiO1xuXG4gICAgICBjb25zdCBjYXRlZ29yaWVzID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEucHJvZHVjdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjYXRlZ29yaWVzLnB1c2goZGF0YS5wcm9kdWN0W2ldLmNhdGVnb3J5LnByaW1hcnlDYXRlZ29yeSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjYXRlZ29yaWVzLmpvaW4oXCIsXCIpO1xuICAgIH0sXG5cbiAgICBpbnFDbGllbnRPcmRlck51bTogKGRhdGE/OiB7IGNhcnQ6IHsgZnVsZmlsbWVudElEOiBhbnkgfSB9KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRkb0NoYXREYXRhLmlucUNsaWVudE9yZGVyTnVtO1xuXG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgdmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdFxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUgPT09IFwiW11cIikgcmV0dXJuIFwiXCI7XG5cbiAgICAgICAgd2luZG93LmlucUNsaWVudE9yZGVyTnVtID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRhdGEgJiYgZGF0YS5jYXJ0ICYmIGRhdGEuY2FydC5mdWxmaWxtZW50SURcbiAgICAgICAgPyBkYXRhLmNhcnQuZnVsZmlsbWVudElEXG4gICAgICAgIDogXCJcIjtcbiAgICB9LFxuXG4gICAgaW5xT3JkZXJUeXBlOiAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRkb0NoYXREYXRhLmlucU9yZGVyVHlwZTtcblxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiBcIlwiO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgIHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3RcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlID09PSBcIltdXCIpIHJldHVybiBcIlwiO1xuXG4gICAgICAgIHdpbmRvdy5pbnFPcmRlclR5cGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9LFxuXG4gICAgaW5xT3RoZXJJbmZvOiAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRkb0NoYXREYXRhLmlucU90aGVySW5mbztcblxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiBcIlwiO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgIHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3RcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlID09PSBcIltdXCIpIHJldHVybiBcIlwiO1xuXG4gICAgICAgIHdpbmRvdy5pbnFPdGhlckluZm8gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9LFxuXG4gICAgaW5xU2FsZXNQcmljZXM6ICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZGRvQ2hhdERhdGEuaW5xU2FsZXNQcmljZXM7XG5cbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0XG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSA9PT0gXCJbXVwiKSByZXR1cm4gXCJcIjtcblxuICAgICAgICB3aW5kb3cuaW5xU2FsZXNQcmljZXMgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9LFxuXG4gICAgaW5xU2FsZXNQcm9kdWN0czogKCkgPT4ge1xuICAgICAgbGV0IHZhbHVlID0gZGRvQ2hhdERhdGEuaW5xU2FsZXNQcm9kdWN0cztcblxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiBcIlwiO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgIHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3RcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlID09PSBcIltdXCIpIHJldHVybiBcIlwiO1xuXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHZhbHVlID0gW3ZhbHVlXTtcblxuICAgICAgICB3aW5kb3cuaW5xU2FsZXNQcm9kdWN0cyA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH0sXG5cbiAgICBpbnFTYWxlc1Byb2R1Y3RUeXBlczogKCkgPT4ge1xuICAgICAgbGV0IHZhbHVlID0gZGRvQ2hhdERhdGEuaW5xU2FsZXNQcm9kdWN0VHlwZXM7XG5cbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0XG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSA9PT0gXCJbXVwiKSByZXR1cm4gXCJcIjtcblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB2YWx1ZSA9IFt2YWx1ZV07XG5cbiAgICAgICAgd2luZG93LmlucVNhbGVzUHJvZHVjdFR5cGVzID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfSxcblxuICAgIGlucVNhbGVzUXVhbnRpdGllczogKCkgPT4ge1xuICAgICAgbGV0IHZhbHVlID0gZGRvQ2hhdERhdGEuaW5xU2FsZXNRdWFudGl0aWVzO1xuXG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgdmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdFxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUgPT09IFwiW11cIikgcmV0dXJuIFwiXCI7XG5cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgdmFsdWUgPSBbdmFsdWVdO1xuXG4gICAgICAgIHdpbmRvdy5pbnFTYWxlc1F1YW50aXRpZXMgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9LFxuXG4gICAgcHJlZmVycmVkUmV3YXJkc1RpZXI6IChkYXRhOiB7IHVzZXI6IHsgcHJlZmVycmVkX3Jld2FyZHNfdGllcjogYW55IH0gfSkgPT5cbiAgICAgIGRhdGEudXNlciAmJiBkYXRhLnVzZXIucHJlZmVycmVkX3Jld2FyZHNfdGllclxuICAgICAgICA/IGRhdGEudXNlci5wcmVmZXJyZWRfcmV3YXJkc190aWVyXG4gICAgICAgIDogXCJcIixcblxuICAgIHBhZ2VJRDogKGRhdGE6IHsgcGFnZTogeyBwYWdlSW5mbzogc3RyaW5nIHwgYW55W10gfSB9KSA9PiB7XG4gICAgICAvLyBBc3N1bWluZyBkYXRhQ29sbGVjdG9yIGlzIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBhbiAnZXZlbnQnIHByb3BlcnR5XG4gICAgICBjb25zdCBkYXRhQ29sbGVjdG9yOiBBcnJheTx7IGV2ZW50OiBzdHJpbmc7IGRhdGE6IGFueSB9PiA9IEFycmF5LmlzQXJyYXkoXG4gICAgICAgIHdpbmRvdy5kYXRhQ29sbGVjdG9yXG4gICAgICApXG4gICAgICAgID8gd2luZG93LmRhdGFDb2xsZWN0b3JcbiAgICAgICAgOiBbXTsgLy8gRW5zdXJlIGRhdGFDb2xsZWN0b3IgaXMgYW4gYXJyYXlcbiAgICAgIGNvbnN0IHBhZ2VWaWV3cyA9IGRhdGFDb2xsZWN0b3IuZmlsdGVyKFxuICAgICAgICAoeyBldmVudCB9KSA9PiBldmVudCA9PT0gXCJwYWdldmlld1wiXG4gICAgICApO1xuICAgICAgY29uc3QgcGFnZVZpZXcgPVxuICAgICAgICBwYWdlVmlld3MgJiYgQXJyYXkuaXNBcnJheShwYWdlVmlld3MpICYmIHBhZ2VWaWV3cy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBwYWdlVmlld3Muc2xpY2UoLTEpXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgaWYgKFxuICAgICAgICBkYXRhLnBhZ2UgJiZcbiAgICAgICAgZGF0YS5wYWdlLnBhZ2VJbmZvICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoZGF0YS5wYWdlLnBhZ2VJbmZvKSAmJlxuICAgICAgICBkYXRhLnBhZ2UucGFnZUluZm8ubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwYWdlVmlldyAmJlxuICAgICAgICAgIEFycmF5LmlzQXJyYXkocGFnZVZpZXcpICYmXG4gICAgICAgICAgcGFnZVZpZXcubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIFwicGFnZUluZm9LZXlcIiBpbiBwYWdlVmlld1swXVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gXCJwYWdlSW5mb0tleVwiIGluIHBhZ2VWaWV3WzBdICYmXG4gICAgICAgICAgICB0eXBlb2YgcGFnZVZpZXdbMF0ucGFnZUluZm9LZXkgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgIGRhdGEucGFnZS5wYWdlSW5mb1tcbiAgICAgICAgICAgICAgcGFnZVZpZXdbMF0ucGFnZUluZm9LZXkgYXMga2V5b2YgdHlwZW9mIGRhdGEucGFnZS5wYWdlSW5mb1xuICAgICAgICAgICAgXT8ucGFnZUlEXG4gICAgICAgICAgICA/IGRhdGEucGFnZS5wYWdlSW5mb1tcbiAgICAgICAgICAgICAgICBwYWdlVmlld1swXS5wYWdlSW5mb0tleSBhcyBrZXlvZiB0eXBlb2YgZGF0YS5wYWdlLnBhZ2VJbmZvXG4gICAgICAgICAgICAgIF0/LnBhZ2VJRFxuICAgICAgICAgICAgOiBcIlwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBkYXRhLnBhZ2UucGFnZUluZm9bMF0ucGFnZUlEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2VhcmNoUXVlcnk6IChkYXRhOiB7IHBhZ2U6IHsgYXR0cmlidXRlczogeyBzZWFyY2hTdHJpbmc6IGFueSB9IH0gfSkgPT5cbiAgICAgIGRhdGEucGFnZSAmJiBkYXRhLnBhZ2UuYXR0cmlidXRlc1xuICAgICAgICA/IGRhdGEucGFnZS5hdHRyaWJ1dGVzLnNlYXJjaFN0cmluZ1xuICAgICAgICA6IFwiXCIsXG5cbiAgICBzZWFyY2hSZXN1bHQ6IChkYXRhOiB7IHBhZ2U6IHsgYXR0cmlidXRlczogeyBzZWFyY2hSZXN1bHRzOiBhbnkgfSB9IH0pID0+XG4gICAgICBkYXRhLnBhZ2UgJiYgZGF0YS5wYWdlLmF0dHJpYnV0ZXNcbiAgICAgICAgPyBkYXRhLnBhZ2UuYXR0cmlidXRlcy5zZWFyY2hSZXN1bHRzXG4gICAgICAgIDogXCJcIixcbiAgfTtcbiAgd2luZG93LmdlbmVzeXNEYXRhID0ge1xuICAgIEFDQ09VTlRfVFlQRTogZGRvQ2hhdERhdGEuYWNjb3VudF90eXBlLFxuICAgIEFQUExJQ0FUSU9OOiBnZW5lc3lzRGF0YUZuLnBhZ2VJRChkZG8pLFxuICAgIEFVVEhFTlRJQ0FURUQ6IGdlbmVzeXNEYXRhRm4uYXV0aGVudGljYXRlZChkZG8pLFxuICAgIEJPQV9BU1NPQ0lBVEU6IGRkb0NoYXREYXRhLmJvYV9hc3NvY2lhdGUsXG4gICAgQk9BX1JFVElSRUU6IGRkb0NoYXREYXRhLmJvYV9yZXRpcmVlLFxuICAgIENBTkNFTFJFQVNPTjogZGRvQ2hhdERhdGEuY2FuY2VsX3JlYXNvbixcbiAgICBDQVQ6IGdlbmVzeXNEYXRhRm4uY2F0ZWdvcmllcyhkZG8pLFxuICAgIENPTVBBTllfTkFNRTogZGRvQ2hhdERhdGEuY29tcGFueV9uYW1lLFxuICAgIENPTlZFUlNJT05fU1RBR0U6IGRkb0NoYXREYXRhLmNvbnZlcnNpb25fc3RhZ2UsXG4gICAgQ1VTVE9NRVJfTE9COiBkZG9DaGF0RGF0YS5jdXN0b21lcl9sb2IsXG4gICAgQ1VTVE9NRVJfU0VHTUVOVDogZGRvQ2hhdERhdGEuY3VzdG9tZXJfc2VnbWVudCxcbiAgICBEQVRBOiBkZG9DaGF0RGF0YS5kYXRhLFxuICAgIERJU0FCTEVfQ0hBVDogZ2VuZXN5c0RhdGFGbi5kaXNhYmxlQ2hhdCgpLFxuICAgIEVOVElUTEVNRU5UX0NPREU6IGRkb0NoYXREYXRhLmVudGl0bGVtZW50X2NvZGUsXG4gICAgRVJST1JfQ09VTlQ6IGRkb0NoYXREYXRhLmVycm9yX2NvdW50LFxuICAgIEZJUlNUX0xPR0lOOiBkZG9DaGF0RGF0YS5maXJzdF9sb2dpbixcbiAgICBGSVJTVE5BTUU6IGdlbmVzeXNEYXRhRm4uZmlyc3ROYW1lKGRkbyksXG4gICAgaW5xQ2xpZW50T3JkZXJOdW06IGdlbmVzeXNEYXRhRm4uaW5xQ2xpZW50T3JkZXJOdW0oKSxcbiAgICBpbnFPcmRlclR5cGU6IGdlbmVzeXNEYXRhRm4uaW5xT3JkZXJUeXBlKCksXG4gICAgaW5xT3RoZXJJbmZvOiBnZW5lc3lzRGF0YUZuLmlucU90aGVySW5mbygpLFxuICAgIGlucVNhbGVzUHJpY2VzOiBnZW5lc3lzRGF0YUZuLmlucVNhbGVzUHJpY2VzKCksXG4gICAgaW5xU2FsZXNQcm9kdWN0czogZ2VuZXN5c0RhdGFGbi5pbnFTYWxlc1Byb2R1Y3RzKCksXG4gICAgaW5xU2FsZXNQcm9kdWN0VHlwZXM6IGdlbmVzeXNEYXRhRm4uaW5xU2FsZXNQcm9kdWN0VHlwZXMoKSxcbiAgICBpbnFTYWxlc1F1YW50aXRpZXM6IGdlbmVzeXNEYXRhRm4uaW5xU2FsZXNRdWFudGl0aWVzKCksXG4gICAgaW5xU2l0ZUlEOiBnZW5lc3lzRGF0YUZuLnNpdGVJZCgpLFxuICAgIExBTkdVQUdFOiBnZW5lc3lzRGF0YUZuLmxhbmd1YWdlKGRkbyksXG4gICAgTEFTVE5BTUU6IGdlbmVzeXNEYXRhRm4ubGFzdE5hbWUoZGRvKSxcbiAgICBOQU06IGdlbmVzeXNEYXRhRm4ucHJvZHVjdE5hbWUoZGRvKSxcbiAgICBPTkxJTkVfSUQ6IGdlbmVzeXNEYXRhRm4uT0lEKGRkbyksXG4gICAgT0ZSOiBnZW5lc3lzRGF0YUZuLmZpcnN0T2ZmZXJJZChkZG8pLFxuICAgIE9GRkVSX0NPREU6IGdlbmVzeXNEYXRhRm4uZmlyc3RPZmZlckNvZGUoZGRvKSxcbiAgICBQQUdFX1RZUEU6IGRkb0NoYXREYXRhLlBhZ2VUeXBlLFxuICAgIFBBR0VfTE9BRFRJTUU6IGRkb0NoYXREYXRhLnBhZ2VfbG9hZHRpbWUsXG4gICAgUFJFRkVSUkVEX1JFV0FSRFNfVElFUjogZ2VuZXN5c0RhdGFGbi5wcmVmZXJyZWRSZXdhcmRzVGllcihkZG8pLFxuICAgIFBSRVFVQUxJRklDQVRJT046IGdlbmVzeXNEYXRhRm4ucGFnZUlEKGRkbyksXG4gICAgUFJPRFVDVF9ESVNQTEFZOiBnZW5lc3lzRGF0YUZuLnByb2R1Y3ROYW1lKGRkbyksXG4gICAgUFJPRFVDVF9UWVBFOiBkZG9DaGF0RGF0YS5Qcm9kdWN0X3R5cGUsXG4gICAgUFJPRFVDVF9WSUVXOiBnZW5lc3lzRGF0YUZuLnByb2R1Y3ROYW1lKGRkbyksXG4gICAgUFJPRFVDVFNFTEVDVElPTl9QVVJDSEFTRUZMT1c6IGdlbmVzeXNEYXRhRm4ucGFnZUlEKGRkbyksXG4gICAgUkVGRVJSQUxfQ0FNUEFJR046IGRkb0NoYXREYXRhLnJlZmVycmFsX2NhbXBhaWduLFxuICAgIFNUQVRFOiBnZW5lc3lzRGF0YUZuLnN0YXRlKGRkbyksXG4gICAgU1VCX1NFQ1RJT046IGRkb0NoYXREYXRhLlN1Yl9TZWN0aW9uLFxuICAgIFRJTUVaT05FOiBkZG9DaGF0RGF0YS50aW1lem9uZSxcbiAgICBUT09MX0lOVEVSTkFMU0VBUkNIUVVFUlk6IGdlbmVzeXNEYXRhRm4uc2VhcmNoUXVlcnkoZGRvKSxcbiAgICBUT09MX0lOVEVSTkFMU0VBUkNIUkVTVUxUOiBnZW5lc3lzRGF0YUZuLnNlYXJjaFJlc3VsdChkZG8pLFxuICAgIFRPUElDX1NFTEVDVElPTjogZGRvQ2hhdERhdGEudG9waWNfc2VsZWN0aW9uLFxuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIGNvbnN0IGVtcHR5ID1cbiAgICAgIHZhbHVlID09PSBcIlwiIHx8XG4gICAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAhaXNFbXB0eUFycih2YWx1ZSkgfHxcbiAgICAgICFpc0VtcHR5T2JqKHZhbHVlKTtcblxuICAgIHJldHVybiAhZW1wdHk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGl0ZW0gaW4gZ2VuZXN5c0RhdGEpIHtcbiAgICBpZiAodmFsaWRhdGVWYWx1ZSgoZ2VuZXN5c0RhdGEgYXMgUmVjb3JkPHN0cmluZywgYW55PilbaXRlbV0pKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWVcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgKGdlbmVzeXNEYXRhIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2l0ZW1dO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBfcmVsb2FkKCkge1xuICBpZiAod2hpY2hEb21haW4oKSA9PT0gTUVSUklMTCB8fCB3aGljaERvbWFpbigpID09PSBJTlRFUk5BTCkge1xuICAgIHdpbmRvdy5nZW5lc3lzRGF0YSA9IHt9O1xuICAgIHdpbmRvdy5nZW5lc3lzRGF0YSA9XG4gICAgICBiYWN0bSAmJiBiYWN0bS5kZG9cbiAgICAgICAgPyBiYWN0bS5kZG8uZ2V0KFwicGFnZS5hdHRyaWJ1dGVzLmNoYXRcIilcbiAgICAgICAgOiBkaWdpdGFsRGF0YS5wYWdlLmF0dHJpYnV0ZXMuY2hhdDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkZG8gPSB3aW5kb3cuZGlnaXRhbERhdGE7XG4gICAgX3ByZXBhcmVEYXRhKGRkbyk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaW5pdGlhbGl6ZSgpIHtcbiAgaWYgKHdoaWNoRG9tYWluKCkgPT09IE1FUlJJTEwgfHwgd2hpY2hEb21haW4oKSA9PT0gSU5URVJOQUwpIHtcbiAgICB3aW5kb3cuZ2VuZXN5c0RhdGEgPSB7fTtcbiAgICB3aW5kb3cuZ2VuZXN5c0RhdGEgPVxuICAgICAgYmFjdG0gJiYgYmFjdG0uZGRvXG4gICAgICAgID8gYmFjdG0uZGRvLmdldChcInBhZ2UuYXR0cmlidXRlcy5jaGF0XCIpXG4gICAgICAgIDogZGlnaXRhbERhdGEucGFnZS5hdHRyaWJ1dGVzLmNoYXQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgY29uc3QgcmVmcmVzaEdlbmVzeXNEYXRhID0gc2V0SW50ZXJ2YWwoX3JlbG9hZCwgMTUwMDApO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGRkbyA9IHdpbmRvdy5kaWdpdGFsRGF0YTtcbiAgICBfcHJlcGFyZURhdGEoZGRvKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBjb25zdCByZWZyZXNoR2VuZXN5c0RhdGEgPSBzZXRJbnRlcnZhbChfcmVsb2FkLCAxNTAwMCk7XG4gIH1cbn1cbndpbmRvdy5ib2EgPSB3aW5kb3cuYm9hIHx8IHt9O1xud2luZG93LmJvYS5jaGF0ID0ge1xuICBpbml0OiBfaW5pdGlhbGl6ZSxcbiAgcmVsb2FkOiBfcmVsb2FkLFxufTtcbiIsIi8vIEB0cy1ub2NoZWNrXG5cbi8qKiBAbW9kdWxlIHNhbGVzL2dyYWItZGF0YSAqL1xuaW1wb3J0IHtcbiAgTU9OSVRPUklOR0pTX0hFQVJUQkVBVCxcbn0gZnJvbSAnLi4vd2lkZ2V0LWNvbnN0YW50cyc7XG5cbi8qKlxuICogQ2hlY2sgaWYgdHdvIGFycmF5cyBhcmUgZXF1YWxcbiAqIEBwYXJhbSAge0FycmF5fSAgIGFycjEgVGhlIGZpcnN0IGFycmF5XG4gKiBAcGFyYW0gIHtBcnJheX0gICBhcnIyIFRoZSBzZWNvbmQgYXJyYXlcbiAqIEByZXR1cm4ge0Jvb2xlYW59ICAgICAgSWYgdHJ1ZSwgYm90aCBhcnJheXMgYXJlIGVxdWFsXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5jb25zdCBhcnJheXNNYXRjaCA9IGZ1bmN0aW9uIGNoZWNrQXJycyhhcnIxOiBhbnlbXSwgYXJyMjogYW55W10pOiBib29sZWFuIHtcbiAgLy8gQ2hlY2sgaWYgdGhlIGFycmF5cyBhcmUgdGhlIHNhbWUgbGVuZ3RoXG4gIGlmIChhcnIxLmxlbmd0aCAhPT0gYXJyMi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAvLyBDaGVjayBpZiBhbGwgaXRlbXMgZXhpc3QgYW5kIGFyZSBpbiB0aGUgc2FtZSBvcmRlclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFycjEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYXJyMVtpXSAhPT0gYXJyMltpXSkgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gT3RoZXJ3aXNlLCByZXR1cm4gdHJ1ZVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQ29tcGFyZSB0d28gaXRlbXMgYW5kIHB1c2ggbm9uLW1hdGNoZXMgdG8gb2JqZWN0XG4gKiBAcGFyYW0gIHsqfSAgICAgIGl0ZW0xIFRoZSBmaXJzdCBpdGVtXG4gKiBAcGFyYW0gIHsqfSAgICAgIGl0ZW0yIFRoZSBzZWNvbmQgaXRlbVxuICogQHBhcmFtICB7U3RyaW5nfSBrZXkgICBUaGUga2V5IGluIG91ciBvYmplY3RcbiAqIEByZXR1cm5zIHtPYmplY3R9IGRpZmZzIFRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBvYmplY3RzXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5jb25zdCBjb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZUl0ZW1zKGl0ZW0xOiBhbnlbXSwgaXRlbTI6IGFueVtdLCBrZXk6IHN0cmluZywgZGlmZnM6IG9iamVjdCk6IG9iamVjdCB7XG4gIC8vIEdldCB0aGUgb2JqZWN0IHR5cGVcbiAgY29uc3QgdHlwZTEgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlbTEpO1xuICBjb25zdCB0eXBlMiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVtMik7XG5cbiAgLy8gSWYgdHlwZTIgaXMgdW5kZWZpbmVkIGl0IGhhcyBiZWVuIHJlbW92ZWRcbiAgaWYgKHR5cGUyID09PSAnW29iamVjdCBVbmRlZmluZWRdJykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIGRpZmZzW2tleV0gPSBudWxsO1xuICB9XG5cbiAgLy8gSWYgaXRlbXMgYXJlIGRpZmZlcmVudCB0eXBlc1xuICBpZiAodHlwZTEgIT09IHR5cGUyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgZGlmZnNba2V5XSA9IGl0ZW0yO1xuICB9XG5cbiAgLy8gSWYgYW4gb2JqZWN0LCBjb21wYXJlIHJlY3Vyc2l2ZWx5XG4gIGlmICh0eXBlMSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICBjb25zdCBvYmpEaWZmID0gZGlmZihpdGVtMSwgaXRlbTIpO1xuICAgIGlmIChPYmplY3Qua2V5cyhvYmpEaWZmKS5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgIGRpZmZzW2tleV0gPSBvYmpEaWZmO1xuICAgIH1cbiAgfVxuXG4gIC8vIElmIGFuIGFycmF5LCBjb21wYXJlXG4gIGlmICh0eXBlMSA9PT0gJ1tvYmplY3QgQXJyYXldJykge1xuICAgIGlmICghYXJyYXlzTWF0Y2goaXRlbTEsIGl0ZW0yKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICBkaWZmc1trZXldID0gaXRlbTI7XG4gICAgfVxuICB9XG5cbiAgLy8gRWxzZSBpZiBpdCdzIGEgZnVuY3Rpb24sIGNvbnZlcnQgdG8gYSBzdHJpbmcgYW5kIGNvbXBhcmVcbiAgLy8gT3RoZXJ3aXNlLCBqdXN0IGNvbXBhcmVcbiAgaWYgKHR5cGUxID09PSAnW29iamVjdCBGdW5jdGlvbl0nKSB7XG4gICAgaWYgKGl0ZW0xLnRvU3RyaW5nKCkgIT09IGl0ZW0yLnRvU3RyaW5nKCkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgZGlmZnNba2V5XSA9IGl0ZW0yO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpdGVtMSAhPT0gaXRlbTIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICBkaWZmc1trZXldID0gaXRlbTI7XG4gIH1cblxuICByZXR1cm4gZGlmZnM7XG59O1xuXG4vKipcbiAqIEZpbmQgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIG9iamVjdHMgYW5kIHB1c2ggdG8gYSBuZXcgb2JqZWN0XG4gKiBAcGFyYW0gIHtPYmplY3R9IG9iajEgVGhlIG9yaWdpbmFsIG9iamVjdFxuICogQHBhcmFtICB7T2JqZWN0fSBvYmoyIFRoZSBvYmplY3QgdG8gY29tcGFyZSBhZ2FpbnN0IGl0XG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgQW4gb2JqZWN0IG9mIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3b1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuY29uc3QgZGlmZiA9IGZ1bmN0aW9uIGZpbmREaWZmZXJlbmNlcyhvYmoxOiBvYmplY3QsIG9iajI/OiBvYmplY3QpOiBvYmplY3Qge1xuICAvLyBNYWtlIHN1cmUgYW4gb2JqZWN0IHRvIGNvbXBhcmUgaXMgcHJvdmlkZWRcbiAgaWYgKCFvYmoyIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmoyKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICByZXR1cm4gb2JqMTtcbiAgfVxuXG4gIC8vIFZhcmlhYmxlc1xuICBsZXQgZGlmZnMgPSB7fTtcblxuICAvLyBMb29wIHRocm91Z2ggdGhlIGZpcnN0IG9iamVjdFxuICBmb3IgKGxldCBpID0gMCwga2V5cyA9IE9iamVjdC5rZXlzKG9iajEpOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGRpZmZzID0gY29tcGFyZShvYmoxW2tleXNbaV1dLCBvYmoyW2tleXNbaV1dLCBrZXlzW2ldLCBkaWZmcyk7XG4gIH1cblxuICAvLyBMb29wIHRocm91Z2ggdGhlIHNlY29uZCBvYmplY3QgYW5kIGZpbmQgbWlzc2luZyBpdGVtc1xuICBmb3IgKGxldCBpID0gMCwga2V5cyA9IE9iamVjdC5rZXlzKG9iajIpOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGlmICghb2JqMVtrZXlzW2ldXSAmJiBvYmoxW2tleXNbaV1dICE9PSBvYmoyW2tleXNbaV1dKSB7XG4gICAgICBkaWZmc1trZXlzW2ldXSA9IG9iajJba2V5c1tpXV07XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJuIHRoZSBvYmplY3Qgb2YgZGlmZmVyZW5jZXNcbiAgcmV0dXJuIGRpZmZzO1xufTtcblxuLyoqXG4gKiBIYW5kbGUgZ3JhYmJpbmcgZGF0YVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaGFuZGxlR3JhYkRhdGEoZGF0YTogb2JqZWN0LCBrZXlib2FyZFRpbWVzdGFtcDogbnVtYmVyLCBtb3VzZVRpbWVzdGFtcDogbnVtYmVyKTogb2JqZWN0IHtcbiAgbGV0IG5ld0RhdGE7XG4gIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICBkYXRhID0gd2luZG93LmdlbmVzeXNEYXRhO1xuICB9IGVsc2Uge1xuICAgIG5ld0RhdGEgPSB3aW5kb3cuZ2VuZXN5c0RhdGE7XG4gIH1cblxuICBjb25zdCBkZWx0YURhdGEgPSBkaWZmKGRhdGEsIG5ld0RhdGEpO1xuICBjb25zdCB1c2VyS2V5Ym9hcmRBY3Rpdml0eSA9IGtleWJvYXJkVGltZXN0YW1wO1xuICBjb25zdCB1c2VyTW91c2VBY3Rpdml0eSA9IG1vdXNlVGltZXN0YW1wO1xuICBsZXQgZGF0YVRvU2VuZDtcblxuICBpZiAodXNlcktleWJvYXJkQWN0aXZpdHkgJiYgdXNlck1vdXNlQWN0aXZpdHkpIHtcbiAgICBkYXRhVG9TZW5kID0ge1xuICAgICAgLi4uZGVsdGFEYXRhLFxuICAgICAgdXNlcktleWJvYXJkQWN0aXZpdHksXG4gICAgICB1c2VyTW91c2VBY3Rpdml0eSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHVzZXJLZXlib2FyZEFjdGl2aXR5KSB7XG4gICAgZGF0YVRvU2VuZCA9IHtcbiAgICAgIC4uLmRlbHRhRGF0YSxcbiAgICAgIHVzZXJLZXlib2FyZEFjdGl2aXR5LFxuICAgIH07XG4gIH0gZWxzZSBpZiAodXNlck1vdXNlQWN0aXZpdHkpIHtcbiAgICBkYXRhVG9TZW5kID0ge1xuICAgICAgLi4uZGVsdGFEYXRhLFxuICAgICAgdXNlck1vdXNlQWN0aXZpdHksXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhVG9TZW5kID0ge1xuICAgICAgLi4uZGVsdGFEYXRhLFxuICAgIH07XG4gIH1cblxuICBUZWFsaXVtUHViU3ViLnB1Ymxpc2goTU9OSVRPUklOR0pTX0hFQVJUQkVBVCwgZGF0YVRvU2VuZCk7XG5cbiAgY29uc3QgbmV3T3JpZ2luYWxEYXRhID0ge1xuICAgIC4uLmRhdGEsXG4gICAgLi4ubmV3RGF0YSxcbiAgfTtcblxuICByZXR1cm4gbmV3T3JpZ2luYWxEYXRhO1xufVxuIiwiLy8gQHRzLW5vY2hlY2tcblxuLyoqIEBtb2R1bGUgc2FsZXMvaGVhcnRiZWF0ICovXG5pbXBvcnQge1xuICBNT05JVE9SSU5HSlNfSEVBUlRCRUFUX0ZBSUxVUkUsXG4gIFBJWEVMX1RBR19VUkwsXG59IGZyb20gJy4uL3dpZGdldC1jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgaW5jcmVhc2VFcnJvckNvdW50LFxuICBsb2dHZW5lc3lzRXZlbnQsXG59IGZyb20gJy4uL3V0aWxpdGllcy91dGlsaXRpZXMnO1xuXG4vKipcbiAqIERpZ2l0YWxEYXRhT2JqZWN0IGlzIG1lcmdlZCB3aXRoIFRDRGF0YVxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIG5hbWUgb2YgZXZlbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXlsb2FkIC0gaGVhcnRiZWF0IGRhdGEgKERETyBEYXRhIFZhbHVlcylcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoZXZlbnROYW1lOiBzdHJpbmcsIHBheWxvYWQ6IHN0cmluZykge1xuICB0cnkge1xuICAgIGxvZ0dlbmVzeXNFdmVudCgxLCAnTW9uaXRvcmluZyBIZWFydGJlYXQnLCBwYXlsb2FkKTtcbiAgICBfZ3QucHVzaChbJ2V2ZW50JywgJ2hlYXJ0YmVhdCcsIHsgZGF0YTogcGF5bG9hZCB9XSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dHZW5lc3lzRXZlbnQoMywgJ01vbml0b3JpbmcgSGVhcnRiZWF0IEVycm9yJywgZSk7XG4gICAgVGVhbGl1bVB1YlN1Yi5wdWJsaXNoKE1PTklUT1JJTkdKU19IRUFSVEJFQVRfRkFJTFVSRSwgZSk7XG4gICAgaWYgKGJhY3RtICYmIGJhY3RtLnBsdWdpbnMgJiYgYmFjdG0ucGx1Z2lucy5waXhlbFRhZykgYmFjdG0ucGx1Z2lucy5waXhlbFRhZy5maXJlUGl4ZWxUYWcoYCR7UElYRUxfVEFHX1VSTH0/ZXJyb3I9JHtlfWApO1xuICAgIGluY3JlYXNlRXJyb3JDb3VudCgpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbiIsIi8vIEB0cy1ub2NoZWNrXG5cbmltcG9ydCB7Y2hhdFNpdGVQYXJhbXMsIEdFTkVTWVNfUkVRVUVTVF9UQ19VUERBVEVfRkFJTFVSRSwgR0VORVNZU19SRVFVRVNUX1RDX1VQREFURV9TVUNDRVNTLCBHRU5FU1lTX1VQREFURV9DSEFUX0RBVEFfRU5EUE9JTlQsIFBJWEVMX1RBR19VUkwsIFNJVEVfSU5GT19BVkFJTEFCTEV9IGZyb20gXCIuLi93aWRnZXQtY29uc3RhbnRzXCI7XG5pbXBvcnQge2dldEN1cnJlbnREb21haW4sIGdldEdTSUQsIGluY3JlYXNlRXJyb3JDb3VudCwgbG9nR2VuZXN5c0V2ZW50LCBwdWJsaXNoV2luZG93fSBmcm9tIFwiLi4vdXRpbGl0aWVzL3V0aWxpdGllc1wiO1xuaW1wb3J0IG1vYmlsZUFDU0xvZ2dlclNlcnZpY2UgZnJvbSAnLi4vdXRpbGl0aWVzL2xvZ2dlcic7XG5cbi8qKlxuICogRXJyb3IgdGMtdXBkYXRlIEV2ZW50XG4gKiBAcGFyYW0ge29iamVjdH0gcmVzcG9uc2UgLSBFcnJvciByZXNwb25zZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvclRDVXBkYXRlRXZlbnQocmVzcG9uc2U6IGFueSkge1xuICBwdWJsaXNoV2luZG93KEdFTkVTWVNfUkVRVUVTVF9UQ19VUERBVEVfRkFJTFVSRSwgcmVzcG9uc2UpXG4gIGlmIChiYWN0bSAmJiBiYWN0bS5wbHVnaW5zICYmIGJhY3RtLnBsdWdpbnMucGl4ZWxUYWcpIHtcbiAgICBiYWN0bS5wbHVnaW5zLnBpeGVsVGFnLmZpcmVQaXhlbFRhZyhgJHtQSVhFTF9UQUdfVVJMfT9lcnJvcj0ke3Jlc3BvbnNlfWApO1xuICB9XG4gIG1vYmlsZUFDU0xvZ2dlclNlcnZpY2UoJ3VwZGF0ZUNoYXREYXRhJywgcmVzcG9uc2UpO1xuICBsb2dHZW5lc3lzRXZlbnQoMywgJ1RDLVVwZGF0ZSBSZXF1ZXN0IEZhaWx1cmUnLCByZXNwb25zZSk7XG4gIGluY3JlYXNlRXJyb3JDb3VudCgpO1xuICByZXR1cm4gZmFsc2U7XG5cbn1cblxuLyoqXG4gKiBTdWNjZXNzIHRjLXVwZGF0ZSBFdmVudFxuICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIC0gU3VjY2VzcyBSZXNwb25zZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBcbiAqIHN1Y2Nlc3MgcmVzcG9uc2VcbiAqIHtcbiAqICBcIlJlYXNvblwiOiBcIlN1Y2Nlc3NmdWxseSBVcGRhdGVkXCIsXG4gKiAgXCJJZFwiOiBcIlRCS0tPNTNKSkgyNlAyMjdBOUtDQjhCTkhHMDAwVUNBXCIsXG4gKiAgXCJJc0NoYXRBY3RpdmVcIjogXCJOXCJcbiAqICAgIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1Y2Nlc3NUQ1VwZGF0ZUV2ZW50KHJlc3BvbnNlOiBvYmplY3QpIHtcbiAgcHVibGlzaFdpbmRvdyhHRU5FU1lTX1JFUVVFU1RfVENfVVBEQVRFX1NVQ0NFU1MsIHJlc3BvbnNlKTtcbiAgbG9nR2VuZXN5c0V2ZW50KDEsICdHRU5FU1lTIFJFUVVFU1QgVEMgVVBEQVRFIFNVQ0NFU1MnLCByZXNwb25zZSk7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBNYWtlcyB0ZXJtcyBhbmQgY29uZGl0aW9ucyB1cGRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBuYW1lIG9mIGV2ZW50XG4gKiBAcGFyYW0ge29iamVjdH0gcGF5bG9hZCAtIG5hbWUgb2YgZXZlbnRcbiAqIHBheWxvYWQgZXhhbXBsZVxuICogXCJ7XFxcIk9GRkVSX01HTVRcXFwiOlt7XFxcImN1cnJlbnRVcmxcXFwiOlxcXCJodHRwczovL3d3dy5iYW5rb2ZhbWVyaWNhLmNvbS9jcmVkaXQtY2FyZHMvcHJvZHVjdHMvY2FzaC1iYWNrLWNyZWRpdC1jYXJkLz9jYW1wYWlnbj00MDYzNzc4fkVLfmVuX1VTXFxcIixcXFwicmVmZXJyZXJcXFwiOlxcXCJodHRwczovL3d3dy5iYW5rb2ZhbWVyaWNhLmNvbS9jcmVkaXQtY2FyZHMvXFxcIixcXFwicHJvZHVjdE5hbWVcXFwiOlxcXCJCYW5rIG9mIEFtZXJpY2EgQ3VzdG9taXplZCBDYXNoIFJld2FyZHMgQ3JlZGl0IENhcmRcXFwiLFxcXCJ0Y0xpbmtcXFwiOlxcXCJodHRwczovL3d3dy5iYW5rb2ZhbWVyaWNhLmNvbS9jcmVkaXQtY2FyZHMvdGVybXMtYW5kLWNvbmRpdGlvbnMvP2NhbXBhaWduaWQ9NDA2Mzc3OCZwcm9kdWN0b2ZmZXJjb2RlPUVLJmxvY2FsZT1lbl9VU1xcXCIsXFxcInRpbWVTdGFtcFxcXCI6XFxcIjE6Mzc6MzEgUE1cXFwiLFxcXCJwYWdlVHlwZVxcXCI6XFxcInJlc2VhcmNoXFxcIn0se1xcXCJjdXJyZW50VXJsXFxcIjpcXFwiaHR0cHM6Ly93d3cuYmFua29mYW1lcmljYS5jb20vY3JlZGl0LWNhcmRzL3Byb2R1Y3RzL3VubGltaXRlZC1jYXNoLWJhY2stc3R1ZGVudC1jcmVkaXQtY2FyZC9cXFwiLFxcXCJyZWZlcnJlclxcXCI6XFxcImh0dHBzOi8vd3d3LmJhbmtvZmFtZXJpY2EuY29tL2NyZWRpdC1jYXJkcy9zdHVkZW50LWNyZWRpdC1jYXJkcy9cXFwiLFxcXCJwcm9kdWN0TmFtZVxcXCI6XFxcIkJhbmsgb2YgQW1lcmljYSBVbmxpbWl0ZWQgQ2FzaCBSZXdhcmRzIENyZWRpdCBDYXJkIGZvciBTdHVkZW50c1xcXCIsXFxcInRjTGlua1xcXCI6XFxcImh0dHBzOi8vd3d3LmJhbmtvZmFtZXJpY2EuY29tL2NyZWRpdC1jYXJkcy90ZXJtcy1hbmQtY29uZGl0aW9ucy8/Y2FtcGFpZ25pZD00MDYzOTIyJnByb2R1Y3RvZmZlcmNvZGU9UzcmbG9jYWxlPWVuX1VTXFxcIixcXFwidGltZVN0YW1wXFxcIjpcXFwiMTo0ODowOCBQTVxcXCIsXFxcInBhZ2VUeXBlXFxcIjpcXFwicmVzZWFyY2hcXFwifV19XCJcblxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoZXZlbnQ6IG9iamVjdCwge1xuICBjaGF0SUQsXG4gIE9GRkVSX01HTVRcbn06IHtjaGF0SUQ6IHN0cmluZywgT0ZGRVJfTUdNVDogb2JqZWN0fSkge1xuICB0cnkge1xuICAgIGlmICh0eXBlb2YgYmFjdG0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dFTkVTWVMgUkVRVUVTVCBUQyBVUERBVEUgUkVRVUVTVCB1bmFibGUgdG8gcHJvY2VzcycpXG4gICAgfVxuICAgIGNvbnN0IGdlbmVzeXNEYXRhID0ge1xuICAgICAgT0ZGRVJfTUdNVFxuICAgIH07XG4gICAgaWYgKGNoYXRJRCAmJiBPRkZFUl9NR01UKSB7XG4gICAgICBjb25zdCBpbnRlcmFjdGlvbklEID0gY2hhdElEO1xuICAgICAgY29uc3QgY3VycmVudFRMRCA9IGdldEN1cnJlbnREb21haW4oKTtcbiAgICAgIGNvbnN0IEdTSUQgPSBnZXRHU0lEKCk7XG4gICAgICBjb25zdCBqc29uVXNlckRhdGEgPSBKU09OLnN0cmluZ2lmeShnZW5lc3lzRGF0YSlcbiAgICAgIGNvbnN0IGdlbmVzeXNUQ1VwZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgX2ludGVyYWN0aW9uX2lkOiBpbnRlcmFjdGlvbklELFxuICAgICAgICBfdXNlcmRhdGE6IGpzb25Vc2VyRGF0YSxcbiAgICAgICAgX0dTSUQ6IEdTSUQsXG4gICAgICAgIF91cGRhdGVGb3JBY3RpdmVDaGF0T25seTogJ1knXG4gICAgICB9O1xuICAgICAgbG9nR2VuZXN5c0V2ZW50KDEsICdHRU5FU1lTIFRFUk1TIEFORCBDT05ESVRJT05TIFVQREFURSBQQVJBTVMnLCBnZW5lc3lzVENVcGRhdGVQYXJhbXMpO1xuXG4gICAgICBjb25zdCBmaXJlVENDaGVjayA9IChldmVudDogc3RyaW5nLCBjaGF0U2l0ZVNwYVBhcmFtczogeyBzaXRlUGFyYW1zOiB7ZG9tYWluczoge319fSkgPT4ge1xuICAgICAgICBjb25zdCBnZW5lc3lzTmF0aXZlQ2hhdEVuZHBvaW50ID0gYCR7Y2hhdFNpdGVTcGFQYXJhbXNbY3VycmVudFRMRF0uZ2VuZXN5c30ke0dFTkVTWVNfVVBEQVRFX0NIQVRfREFUQV9FTkRQT0lOVH1gO1xuICAgICAgICBmZXRjaChnZW5lc3lzTmF0aXZlQ2hhdEVuZHBvaW50LCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZ2VuZXN5c1RDVXBkYXRlUGFyYW1zKSxcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnXG4gICAgICAgIH0pLnRoZW4oKHJlc3ApID0+IHJlc3AuanNvbigpKS50aGVuKHN1Y2Nlc3NUQ1VwZGF0ZUV2ZW50KS5jYXRjaChlcnJvclRDVXBkYXRlRXZlbnQpXG4gICAgICB9XG4gICAgICAvLyBpZiBjaGF0U2l0ZSBwYXJhbXMgaGF2ZSBub3QgYmVlbiByZWNlaXZlZFxuICAgICAgaWYgKCFjaGF0U2l0ZVBhcmFtcy5zcGFQYXJhbXMpIHtcbiAgICAgICAgICAvLyB3YWl0IGZvciBTSVRFX0lORk9fQVZBSUxBQkxFIGV2ZW50LCB0aGVuIGZpcmUgZmV0Y2ggcmVxdWVzdFxuICAgICAgICAgIFRlYWxpdW1QdWJTdWIuc3Vic2NyaWJlKFNJVEVfSU5GT19BVkFJTEFCTEUsIChldmVudE5hbWU6IHN0cmluZywgZGF0YTogYW55KSA9PiB7IGZpcmVUQ0NoZWNrKFNJVEVfSU5GT19BVkFJTEFCTEUsIGRhdGEpIH0pXG4gICAgICAgICAgbG9nR2VuZXN5c0V2ZW50KDEsICdGZXRjaGluZyBjaGF0U2l0ZVBhcmFtcyBmb3IgVEMgQ2FsbCcsIHt9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBmaXJlIGZldGNoIHJlcXVlc3RcbiAgICAgICAgICBmaXJlVENDaGVjayhTSVRFX0lORk9fQVZBSUxBQkxFLCBjaGF0U2l0ZVBhcmFtcy5zcGFQYXJhbXMpXG4gICAgICAgICAgbG9nR2VuZXN5c0V2ZW50KDEsICdGaXJpbmcgVEMgVXBkYXRlIEZldGNoIHJlcXVlc3QnLCBjaGF0U2l0ZVBhcmFtcylcbiAgICAgICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbG9nR2VuZXN5c0V2ZW50KDMsICdDaGF0IElEIHVuZGVmaW5lZCcsIGNoYXRJRClcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnJvclRDVXBkYXRlRXZlbnQoZSlcbiAgfVxuXG59XG4iLCIvLyBAdHMtbm9jaGVja1xuXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqIEBtb2R1bGUgc2FsZXMvcmVxdWVzdCAqL1xuaW1wb3J0IHtcbiAgTU9OSVRPUklOR0pTX1JFU1BPTlNFLFxuICBNT05JVE9SSU5HSlNfUkVTUE9OU0VfRkFJTFVSRSxcbiAgTU9OSVRPUklOR19JRF9SRVNQT05TRSxcbiAgUElYRUxfVEFHX1VSTCxcbn0gZnJvbSAnLi4vd2lkZ2V0LWNvbnN0YW50cyc7XG5pbXBvcnQgeyBcbiAgaW5jcmVhc2VFcnJvckNvdW50LFxuICBsb2dHZW5lc3lzRXZlbnQsXG59IGZyb20gJy4uL3V0aWxpdGllcy91dGlsaXRpZXMnO1xuXG4vKipcbiAqIENvbmZpZ3VyZSBtb25pdG9yaW5nSlMgeG1sLCBhbmQgZ3RjaiBmb3IgaGVhcnRiZWF0XG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIC0gbmFtZSBvZiBldmVudFxuICogQHBhcmFtIHtvYmplY3R9IHJlcXVlc3RDb25maWd1cmF0aW9uIC0gZG9tYWluIGFuZCBVUkkgZHNsUmVzb3VyY2UgfCBodHRwRW5kcG9pbnQgfCBodHRwc0VuZHBvaW50IHwgZ3RjakVuZHBvaW50XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgKGV2ZW50TmFtZTogc3RyaW5nLCByZXF1ZXN0Q29uZmlndXJhdGlvbjogeyBodHRwc0VuZHBvaW50OiBzdHJpbmc7IGh0dHBFbmRwb2ludDogc3RyaW5nOyByZXNvdXJjZVBhdGg6IHN0cmluZzsgZ3RjakVuZHBvaW50OiBzdHJpbmc7IH0pID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBpc01vbml0b3JpbmcgPSBiYWN0bS5kZG8uZ2V0KCdwYWdlLmF0dHJpYnV0ZXMuY2hhdC5tb25pdG9yaW5nJyk7XG4gICAgaWYoaXNNb25pdG9yaW5nKSByZXR1cm47XG4gICAgd2luZG93Ll9ndCA9IHdpbmRvdy5fZ3QgfHwgW107XG4gICAgY29uc3Qge1xuICAgICAgaHR0cHNFbmRwb2ludCwgaHR0cEVuZHBvaW50LCByZXNvdXJjZVBhdGgsIGd0Y2pFbmRwb2ludCxcbiAgICB9ID0gcmVxdWVzdENvbmZpZ3VyYXRpb247XG4gICAgY29uc3QgcHJvdG9jb2wgPSAoZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonID8gaHR0cHNFbmRwb2ludCA6IGh0dHBFbmRwb2ludCk7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHtcbiAgICAgIGRzbFJlc291cmNlOiBgJHtwcm90b2NvbH0vJHtyZXNvdXJjZVBhdGh9YCxcbiAgICAgIGh0dHBFbmRwb2ludCxcbiAgICAgIGh0dHBzRW5kcG9pbnQsXG4gICAgICBndGNqRW5kcG9pbnQsXG4gICAgfTtcbiAgICBsb2dHZW5lc3lzRXZlbnQoMSwgJ01vbml0b3JpbmcgUmVxdWVzdCcsIHJlcXVlc3RDb25maWd1cmF0aW9uKTtcbiAgICAvLyA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIC8vIE1heSByZW1vdmUgdGhpcyBzZWN0aW9uIGJlY2F1c2UgdGhlIGRvbWFpbi14bWwubWlucy5qcyBpcyBiZWluZyBwb3N0ZWQgdHdpY2UuXG4gICAgLy8gVGhpcyBwYXJ0aWN1bGFyIHBvc3RpbmcgaGFzIG5vIHZhcmlhYmxlcyB3aXRoIHRoZSBwb3N0aW5nLCBzbyBpbml0aWFsIGFuYWx5c2lzIHBvaW50cyB0byBubyBmdW5jdGlvbmFsIHZhbHVlLiBcbiAgICBfZ3QucHVzaChbJ2NvbmZpZycsIGNvbmZpZ3VyYXRpb25dKTtcbiAgICAoZnVuY3Rpb24gKGQsIHMsIGlkLCBvKSB7XG4gICAgICBjb25zdCBmcyA9IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUocylbMF07IGxldFxuICAgICAgICBlO1xuICAgICAgaWYgKGQuZ2V0RWxlbWVudEJ5SWQoaWQpKSByZXR1cm47XG4gICAgICBlID0gZC5jcmVhdGVFbGVtZW50KHMpIGFzIEhUTUxTY3JpcHRFbGVtZW50OyBlLmlkID0gaWQ7IGUuc3JjID0gby5zcmM7XG4gICAgICBmcy5wYXJlbnROb2RlPy5pbnNlcnRCZWZvcmUoZSwgZnMpO1xuICAgIH0oZG9jdW1lbnQsICdzY3JpcHQnLCAnZG9tYWluLXhtbCcsIHtcbiAgICAgIHNyYzogY29uZmlndXJhdGlvbi5kc2xSZXNvdXJjZSxcbiAgICB9KSk7XG4gICAgLy8gPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cblxuICAgIF9ndC5wdXNoKFsnZ2V0SURzJywgKElEczogb2JqZWN0KSA9PiB7XG4gICAgICBjb25zdCBxdWVyeVN0cmluZ3MgPSBuZXcgYmFjdG0uUXVlcnlTdHJpbmcod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgY29uc3QgY29va2llcyA9IG5ldyBiYWN0bS5Db29raWVzKCdvY2N0Q2hhdCcpO1xuICAgICAgY29uc3QgY2hlY2tDb29raWUgPSBjb29raWVzLmdldCgnb2NjdENoYXQnKTtcbiAgICAgIGNvbnN0IG9jY3RDaGF0Q29va2llID0gSlNPTi5wYXJzZShjaGVja0Nvb2tpZSk7XG4gICAgICBjb25zdCBkZXRlcm1pbmVOYXRpdmVDaGF0ID0gKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCduYXRpdmVDaGF0PWF2YWlsYWJsZScpID8gJ2F2YWlsYWJsZScgOiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJ25hdGl2ZUNoYXQ9YWN0aXZlJykgPyAnYWN0aXZlJyA6IGZhbHNlKSApIC8vIG5lZWQgdGhpcyBiZWNhdXNlIGJhY3RtLnF1ZXJ5c3RyaW5nIGlzIHRocm93biBvZmYgYnkgd2VpcmQgdXJscy5cbiAgICAgIGNvbnN0IGRldGVybWluZUNoYXRJRCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCc/JylbMV0pIHtcbiAgICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoJz8nKVsxXS5zcGxpdCgnY2hhdElEPScpWzFdKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoJz8nKVsxXS5zcGxpdCgnY2hhdElEPScpWzFdLnNwbGl0KCcmJylbMF0uc3BsaXQoJyMnKVswXTtcbiAgICAgICAgICB9ICBcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyBcbiAgICAgIH07XG5cbiAgICAgIC8vIFRPRE9TOiBXaWxsIGxvb2sgYXQgdGhpcyBsYXRlclxuICAgICAgLy8gY29uc3QgbmF0aXZlQ2hhdCA9IG9jY3RDaGF0Q29va2llPy5uYXRpdmVDaGF0IHx8IHF1ZXJ5U3RyaW5ncy5nZXQoJ25hdGl2ZUNoYXQnKSB8fCBkZXRlcm1pbmVOYXRpdmVDaGF0O1xuICAgICAgLy8gY29uc3QgY2hhdElEID0gb2NjdENoYXRDb29raWU/LmNoYXRJRCB8fCBxdWVyeVN0cmluZ3MuZ2V0KCdjaGF0SUQnKSB8fCBkZXRlcm1pbmVDaGF0SUQoKTtcblxuICAgICAgVGVhbGl1bVB1YlN1Yi5wdWJsaXNoKE1PTklUT1JJTkdfSURfUkVTUE9OU0UsIHsgLi4uSURzIH0pO1xuICAgIH1dKTtcblxuXG4gICAgKGZ1bmN0aW9uIChkLCBzLCBpZCwgbykge1xuICAgICAgY29uc3QgZnMgPSBkLmdldEVsZW1lbnRzQnlUYWdOYW1lKHMpWzBdOyBsZXRcbiAgICAgICAgZTtcbiAgICAgIGlmIChkLmdldEVsZW1lbnRCeUlkKGlkKSkgcmV0dXJuO1xuICAgICAgZSA9IGQuY3JlYXRlRWxlbWVudChzKSBhcyBIVE1MU2NyaXB0RWxlbWVudDsgZS5pZCA9IGlkOyBlLnNyYyA9IG8uc3JjO1xuICAgICAgZnMucGFyZW50Tm9kZT8uaW5zZXJ0QmVmb3JlKGUsIGZzKTtcbiAgICB9KGRvY3VtZW50LCAnc2NyaXB0JywgJ19ndCcsIHtcbiAgICAgIHNyYzogYCR7Y29uZmlndXJhdGlvbi5odHRwc0VuZHBvaW50fS8ke2NvbmZpZ3VyYXRpb24uZ3RjakVuZHBvaW50fWAsXG4gICAgfSkpO1xuXG5cbiAgICBUZWFsaXVtUHViU3ViLnB1Ymxpc2goTU9OSVRPUklOR0pTX1JFU1BPTlNFLCB7fSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dHZW5lc3lzRXZlbnQoMywgYE1vbml0b3JpbmcgUmVxdWVzdCBFcnJvcmAsIGUpO1xuICAgIFRlYWxpdW1QdWJTdWIucHVibGlzaChNT05JVE9SSU5HSlNfUkVTUE9OU0VfRkFJTFVSRSwgZSk7XG4gICAgaWYgKGJhY3RtICYmIGJhY3RtLnBsdWdpbnMgJiYgYmFjdG0ucGx1Z2lucy5waXhlbFRhZykgYmFjdG0ucGx1Z2lucy5waXhlbFRhZy5maXJlUGl4ZWxUYWcoYCR7UElYRUxfVEFHX1VSTH0/ZXJyb3I9JHtlfWApO1xuICAgIGluY3JlYXNlRXJyb3JDb3VudCgpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07IiwiLy8gQHRzLW5vY2hlY2tcblxuLyoqIEBtb2R1bGUgc2FsZXMvcmVzcG9uc2UgKi9cbmltcG9ydCBncmFiRGF0YSBmcm9tICcuL2dyYWItZGF0YSc7XG5pbXBvcnQge1xuICBHRU5FU1lTX1NVU1BFTkRfTU9OSVRPUklORyxcbiAgQ0hFQ0tfQUhfVE9LRU4sXG59IGZyb20gJy4uL3dpZGdldC1jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgc2V0TW9uaXRvcmluZ1N0YXR1cyxcbn0gZnJvbSAnLi4vcHVic3ViL3Bvc3QtbWVzc2FnZXMnO1xuXG5sZXQgb3JpZ2luYWxEYXRhOiBvYmplY3QgPSB7fTtcbmxldCBtb3VzZUV2ZW50OiBudW1iZXI7XG5sZXQga2V5Ym9hcmRFdmVudDogbnVtYmVyO1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsICgpID0+IHtcbiAga2V5Ym9hcmRFdmVudCA9IERhdGUubm93KCk7XG59KTtcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsICgpID0+IHtcbiAgbW91c2VFdmVudCA9IERhdGUubm93KCk7XG59KTtcblxuLyoqXG4gKiBIYW5kbGUgbW9uaXRvcmluZyByZXNwb25zZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGhhbmRsZU1vbml0b3JpbmdSZXNwb25zZSgpIHtcbiAgbGV0IGhlYXJ0YmVhdHNTZW50ID0gMDtcbiAgc2V0TW9uaXRvcmluZ1N0YXR1cyh0cnVlKTtcbiAgY29uc3QgaGVhcnRiZWF0VGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ3Zpc2libGUnKSB7XG4gICAgICBpZiAoaGVhcnRiZWF0c1NlbnQgPCAyMCkge1xuICAgICAgICBUZWFsaXVtUHViU3ViLnB1Ymxpc2goQ0hFQ0tfQUhfVE9LRU4pO1xuICAgICAgICBoZWFydGJlYXRzU2VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xlYXJIZWFydGJlYXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIDMwMDAwKTtcblxuICBUZWFsaXVtUHViU3ViLnB1Ymxpc2goQ0hFQ0tfQUhfVE9LRU4pO1xuXG4gIGZ1bmN0aW9uIGNsZWFySGVhcnRiZWF0KCkge1xuICAgIHNldE1vbml0b3JpbmdTdGF0dXMoZmFsc2UpO1xuICAgIGNsZWFySW50ZXJ2YWwoaGVhcnRiZWF0VGltZXIpO1xuICAgIFRlYWxpdW1QdWJTdWIudW5zdWJzY3JpYmUoR0VORVNZU19TVVNQRU5EX01PTklUT1JJTkcpO1xuICB9XG5cbiAgVGVhbGl1bVB1YlN1Yi5zdWJzY3JpYmUoR0VORVNZU19TVVNQRU5EX01PTklUT1JJTkcsIGNsZWFySGVhcnRiZWF0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyYWJIZWFydGJlYXREYXRhKCkge1xuICBvcmlnaW5hbERhdGEgPSBncmFiRGF0YShvcmlnaW5hbERhdGEsIGtleWJvYXJkRXZlbnQsIG1vdXNlRXZlbnQpO1xufVxuIiwiLy8gQHRzLW5vY2hlY2tcblxuLy8gdGhpcyB1dGlsaXR5IG1ldGhvZCBhbGxvd3MgdXMgdG8gcHJvcGVybHkgaGFuZGxlIGFsbCBuZXR3b3JrIHJlcXVlc3QgZXJyb3JzXG4vLyB0aGlzIGFsc28gYWxsb3dzIHVzIHRvIHJldHJ5IG5ldHdvcmsgY2FsbHMsIG9taXQgdGhlIHJldHJ5IHBhcmFtZXRlciB3aWxsIGVmZmVjdGl2ZWx5IHR1cm4gb2ZmIHJldHJpZXNcblxuLy8gZXhhbXBsZSB1c2FnZTpcbi8vIGltcG9ydCBmZXRjaFdpdGhSZXRyeSBmcm9tICcuLi91dGlsaXRpZXMvZmV0Y2gtd2l0aC1yZXRyeSdcbi8vIGltcG9ydCB7IE1BWF9FUlJfUkVUUklFUyB9IGZyb20gJy4vd2lkZ2V0LWNvbnN0YW50cyc7XG4vLyBmZXRjaFdpdGhSZXRyeSgnaHR0cDovL2xvY2FsaG9zdDo0MDAwL21vY2tfcmVmSUQnLCB7XG4vLyAgICAgbWV0aG9kOiAnUE9TVCcsXG4vLyAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4vLyAgICAgaGVhZGVyczogeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9XG4vLyB9LCBNQVhfRVJSX1JFVFJJRVMpXG4vLyAudGhlbigocmVzcG9uc2UpID0+IGNvbnNvbGUubG9nKCdTVUNDQ0VTUyB3aXRoIHJldHJ5JywgcmVzcG9uc2UpKVxuLy8gLmNhdGNoKChyZXNwb25zZSkgPT4gY29uc29sZS5sb2coJ0VSUk9SIHdpdGggcmV0cnknLCByZXNwb25zZSkpO1xuXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBmZXRjaFdpdGhSZXRyeSh1cmw6IHN0cmluZywgb3B0aW9uczogb2JqZWN0LCByZXRyaWVzOiBudW1iZXIgPSAwKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgb3B0aW9ucyk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBzYW5pdGl6ZVJldHJ5ID0gTWF0aC5hYnMocmV0cmllcyk7XG4gICAgICAgIGlmIChzYW5pdGl6ZVJldHJ5ID4gMCkgcmV0dXJuIGZldGNoV2l0aFJldHJ5KHVybCwgb3B0aW9ucywgc2FuaXRpemVSZXRyeSAtIDEpXG4gICAgICAgIHRocm93IEVycm9yKHJlc3BvbnNlLnN0YXR1c1RleHQpXG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9XG59IiwiLy8gQHRzLW5vY2hlY2tcblxuLyoqIEBtb2R1bGUgdXRpbGl0aWVzL2dldC1jb29raWUgKi9cbmltcG9ydCB7IENPT0tJRSB9IGZyb20gJy4uL3dpZGdldC1jb25zdGFudHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb29raWVTdG9yYWdlKG5hbWU6IG9iamVjdCB8IHN0cmluZyA9IENPT0tJRS5OQU1FKTogYW55IHtcbiAgY29uc3QgbG9va3VwID0gYCR7bmFtZX09YDtcbiAgY29uc3QgZGVjb2RlZENvb2tpZSA9IGRlY29kZVVSSUNvbXBvbmVudChkb2N1bWVudC5jb29raWUpO1xuICBjb25zdCBjb29raWVBcnIgPSBkZWNvZGVkQ29va2llLnNwbGl0KCc7Jyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29va2llQXJyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgbGV0IGNvb2tpZSA9IGNvb2tpZUFycltpXTtcbiAgICB3aGlsZSAoY29va2llLmNoYXJBdCgwKSA9PT0gJyAnKSB7XG4gICAgICBjb29raWUgPSBjb29raWUuc3Vic3RyaW5nKDEpO1xuICAgIH1cbiAgICBpZiAoY29va2llLmluZGV4T2YobG9va3VwKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoY29va2llLnN1YnN0cmluZyhsb29rdXAubGVuZ3RoLCBjb29raWUubGVuZ3RoKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7fTtcbn1cbiIsIi8vIEB0cy1ub2NoZWNrXG5cbi8qKiBAbW9kdWxlIHV0aWxpdGllcy9zZXQtY29va2llICovXG5pbXBvcnQgeyBDT09LSUUgfSBmcm9tICcuLi93aWRnZXQtY29uc3RhbnRzJztcbmltcG9ydCBnZXRDb29raWVTdG9yYWdlIGZyb20gJy4vZ2V0LWNvb2tpZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNldENvb2tpZVN0b3JhZ2UocGF5bG9hZDogb2JqZWN0LCBjb29raWU6IHsgTkFNRTogc3RyaW5nLCBFWFBJUkFUSU9OOiBudW1iZXIsIERPTUFJTjogc3RyaW5nLCBTRUNVUkU6IGJvb2xlYW4sIFBBVEg6IHN0cmluZyB9ID0gQ09PS0lFKSB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkVmFsdWUgPSBKU09OLnN0cmluZ2lmeShPYmplY3QuYXNzaWduKGdldENvb2tpZVN0b3JhZ2UoY29va2llLk5BTUUpLCBwYXlsb2FkKSk7XG4gIGNvbnN0IGlzTG9jYWwgPSB3aW5kb3cuc3BhcnRhLmVudiA9PT0gJ2xvY2FsJztcbiAgY29uc3QgZXhwaXJ5ID0gYDsgZXhwaXJlcz0keyhuZXcgRGF0ZShEYXRlLm5vdygpICsgKGNvb2tpZS5FWFBJUkFUSU9OICogMjQgKiA2MCAqIDYwICogMTAwMCkpKS50b1VUQ1N0cmluZygpfWA7XG4gIGNvbnN0IGRvbWFpbiA9IGlzTG9jYWwgPyAnJyA6IGA7IGRvbWFpbj0ke2Nvb2tpZS5ET01BSU59YDtcbiAgY29uc3Qgc2VjdXJlID0gKGNvb2tpZS5TRUNVUkUgJiYgIWlzTG9jYWwpID8gJzsgc2VjdXJlJyA6ICcnO1xuICBjb25zdCBjb29raWVJbmZvID0gYCR7Y29va2llLk5BTUV9PSR7c3RyaW5naWZpZWRWYWx1ZX0ke2V4cGlyeX07IHBhdGg9JHtjb29raWUuUEFUSH0ke2RvbWFpbn0ke3NlY3VyZX1gO1xuXG4gIHdpbmRvdy5kb2N1bWVudC5jb29raWUgPSBjb29raWVJbmZvO1xufVxuIiwiLyoqIEBtb2R1bGUgdXRpbGl0aWVzL3V0aWxpdGllcyAqL1xuXG5pbXBvcnQge1xuICBCT0ZBLFxuICBCT0ZBX0RPTUFJTlMsXG4gIEJPRkFfU0FMRV9JTkRJQ0FUT1JTLFxuICBDQU5DRUxfU0lURV9TVUJTLFxuICBJTlRFUk5BTCxcbiAgSU5RX0NMSUVOVF9PUkRFUl9OVU0sXG4gIElSX0VOVixcbiAgTUFYX0VSUl9SRVRSSUVTLFxuICBNRVJSSUxMLFxuICBNTF9TQUxFX0lORElDQVRPUlMsXG4gIFNQQVJUQSxcbiAgQ09PS0lFX0dTSUQsXG59IGZyb20gXCIuLi93aWRnZXQtY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzZW5kUHJveHlQb3N0TWVzc2FnZSB9IGZyb20gXCIuLi9wdWJzdWIvcG9zdC1tZXNzYWdlc1wiO1xuaW1wb3J0IGdldENvb2tpZVN0b3JhZ2UgZnJvbSBcIi4vZ2V0LWNvb2tpZVwiO1xuaW1wb3J0IHNldENvb2tpZVN0b3JhZ2UgZnJvbSBcIi4vc2V0LWNvb2tpZVwiO1xuLyoqXG4gKiBpc0ludGVybmFsXG4gKiBXZSB3aWxsIGNoZWNrIHRoZSB1cmwgZm9yIGludGVybmFsIHNpdGVzIHRvIGRlZmF1bHQgdGhlbSB0byBzb3VyY2UgVVJMIGZvciB3aWRnZXRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlcm5hbCgpIHtcbiAgcmV0dXJuIChcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKFwiLy9naHJzaWViZWxcIikgPiAtMSB8fFxuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoXCIvL2Fjb25saW5lXCIpID4gLTEgfHxcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKFwiLy9hc2toclwiKSA+IC0xXG4gICk7XG59XG5cbi8qKlxuICogaXNNZXJyaWxsXG4gKiBXZSB3aWxsIGNoZWNrIHRoZSB1cmwgZm9yIC5tbCBvciAubWVycmlsbGVkZ2UgYW5kIGlmIHNvIHRoZW4gaXQgaXMgYSBNZXJyaWxsIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNZXJyaWxsKCkge1xuICByZXR1cm4gKFxuICAgIHdpbmRvdy5sb2NhdGlvbi5ob3N0LmluZGV4T2YoXCIubWxcIikgPiAtMSB8fFxuICAgIHdpbmRvdy5sb2NhdGlvbi5ob3N0LmluZGV4T2YoXCIubWVycmlsbGVkZ2VcIikgPiAtMVxuICApO1xufVxuXG4vKipcbiAqIGlzU3BhcnRhXG4gKiBXZSB3aWxsIGNoZWNrIHRoZSB1cmwgZm9yIHNwYXJ0YS4gYW5kIGlmIHNvIHRoZW4gaXQgaXMgb24gYSBTcGFydGEgc2l0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NwYXJ0YSgpIHtcbiAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5ob3N0LmluZGV4T2YoXCJzcGFydGEuXCIpID4gLTE7XG59XG5cbi8qKlxuICogaXNTZWN1cmVRQVxuICogUUE1IGFuZCBRQVBTIGFyZSB1bmFibGUgdG8gbG9hZCBkZXYvY2VydCBkb21haW5zLiBUaGlzIGFscmVhZHkgaGFwcGVucyBuYXR1cmFsIGZvciB3d3csXG4gKiBidXQgc2VjdXJlIHdpbGwgbmVlZCB0byBiZSByb3V0ZWRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZWN1cmVRQSgpIHtcbiAgcmV0dXJuIChcbiAgICB3aW5kb3cubG9jYXRpb24uaG9zdC5pbmRleE9mKFwiLXFhNVwiKSA+IC0xIHx8XG4gICAgd2luZG93LmxvY2F0aW9uLmhvc3QuaW5kZXhPZihcIi1xYXBzXCIpID4gLTFcbiAgKTtcbn1cblxuLyoqXG4gKiB3aGljaERvbWFpblxuICogVGhpcyB3aWxsIGJlIHV0aWxpemUgdG8gZGV0ZXJtaW5lIHdoaWNoIHdpZGdldFNjcmlwdCB0byBsb2FkOyB3aGljaCBkb21haW4gdG8gcG9pbnRcbiAqIHdoZW4gcmVmZXJlbmNpbmcgdGhlIHdpZGdldCwgYW5kIHRvIGRldGVybWluZSB3aGljaCBwcmVjb25uZWN0L3BvbGxpbmcgYXR0cmlidXRlcyB0byBwdWxsXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gd2hpY2hEb21haW4oKSB7XG4gIGlmIChpc01lcnJpbGwoKSkge1xuICAgIHJldHVybiBNRVJSSUxMO1xuICB9XG4gIGlmIChpc0ludGVybmFsKCkpIHtcbiAgICByZXR1cm4gSU5URVJOQUw7XG4gIH1cbiAgaWYgKGlzU3BhcnRhKCkpIHtcbiAgICByZXR1cm4gU1BBUlRBO1xuICB9XG4gIHJldHVybiBCT0ZBO1xufVxuXG4vKipcbiAqIFdlIGhhdmUgdHdvIGRpZmZlcmVudCBsYW5ndWFnZSB2ZXJzaW9ucyBvZiBjaGF0LiBBIFNwYW5pc2ggdmVyc2lvbiBhbmQgYW4gRW5nbGlzaCB2ZXJzaW9uLiBXZVxuICogd2lsbCBsb2FkIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gdGhhdCByZWxhdGVzIHRvIGxhbmd1YWdlIHZhbHVlIG9mIHRoZSBwYWdlLlxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3BhbmlzaCgpIHtcbiAgY29uc3Qgc3BhbmlzaElkZW50aWZpZXJzID0gW1wiZXMtdXNcIiwgXCJlc1wiLCBcInNwYW5pc2hcIiwgXCJlc3Bhbm9sXCJdO1xuICBjb25zdCBsYW5ndWFnZSA9XG4gICAgd2luZG93LmdlbmVzeXNEYXRhICYmIHdpbmRvdy5nZW5lc3lzRGF0YS5MQU5HVUFHRVxuICAgICAgPyB3aW5kb3cuZ2VuZXN5c0RhdGEuTEFOR1VBR0VcbiAgICAgIDogXCJlblwiO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGxldCBpc1NwYW5pc2ggPSBmYWxzZTtcbiAgaWYgKFxuICAgIHR5cGVvZiBsYW5ndWFnZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIHNwYW5pc2hJZGVudGlmaWVycy5pbmRleE9mKGxhbmd1YWdlLnRvTG93ZXJDYXNlKCkpID4gLTFcbiAgKSB7XG4gICAgaXNTcGFuaXNoID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gaXNTcGFuaXNoID8gXCJlc1wiIDogXCJlblwiO1xufVxuXG4vKipcbiAqIHF1ZXJ5U3RyaW5nUGFyc2VcbiAqIFVzZWQgdG8gcGFyc2Ugb3V0IHF1ZXJ5IHN0cmluZyB2YWx1ZXMgdG8gcHJvdmlkZSBhIG1vZGlmaWVkIGNoYXQgZXhwZXJpZW5jZSBpbiBMTEVzXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIG5hbWUgZm9yIHF1ZXJ5IHN0cmluZyB0byBwYXJzZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5U3RyaW5nUGFyc2UobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYFs/Jl0ke25hbWV9KD0oW14mI10qKXwmfCN8JClgKTtcbiAgY29uc3QgcmVzdWx0cyA9IHJlZ2V4LmV4ZWModXJsKTtcbiAgaWYgKHJlc3VsdHMgJiYgcmVzdWx0c1syXSkgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChyZXN1bHRzWzJdKTtcbiAgcmV0dXJuIFwiXCI7XG59XG5cblxuXG4vKipcbiAqIHdoaWNoVmVyc2lvblxuICogV2Ugd2lsbCBub3cgaGF2ZSBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB3d3ctY2hhdC9zZWN1cmUtY2hhdC5cbiAqIFNvIHdlIHdpbGwgY2hlY2sgZm9yIHdoaWNoIHZlcnNpb24gdG8gdXNlIHdoaWNoIHdpbGwgYmUgc2VudCBhcyBhIHBhcmFtZXRlclxuICogYXR0YWNoZWQgdG8gYSBxdWVyeSBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aGljaFZlcnNpb24oKSB7XG4gIGNvbnN0IHY2ID0gaXNWNigpO1xuICBpZiAoIXY2KSB7XG4gICAgaWYgKHdpbmRvdy5iYWN0bV9lbnZTZWxlY3RvciA9PT0gXCJub3Rwcm9kXCIpIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBxdWVyeVN0cmluZ1BhcnNlKFwid2lkZ2V0VmVyc2lvblwiKTtcbiAgICAgIGlmICh2ZXJzaW9uICE9PSBcIlwiKSByZXR1cm4gdmVyc2lvbjtcbiAgICAgIHJldHVybiBcIjMuMC4wXCI7XG4gICAgfVxuICAgIHJldHVybiBcIjMuMC4wXCI7XG4gIH1cbiAgcmV0dXJuIFwiMS4wLjBcIjtcbn1cblxuXG4vKipcbiAqIGdldCBWNiB3aWRnZXQgY29uZmlndXJhdGlvblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFY2V2lkZ2V0Q29uZmlnKCkge1xuICBjb25zdCBndENoYXRXaWRnZXQgPSB7XG4gICAgbmFtZTogXCJndC1jaGF0LXdpZGdldFwiLFxuICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAgICBwYXRoOiBnZXREb21haW4oKSxcbiAgICBzcGlubmVyOiBmYWxzZSxcbiAgICBsb2FkZXJWZXJzaW9uOiBcIjYuMC41XCIsXG4gICAgY29udGFpbmVyOiBcIiNjaGF0LXBsYWNlaG9sZGVyXCIsXG4gICAgb3B0aW9uczoge1xuICAgICAgZGF0YTogeyB2NjogdHJ1ZSB9LFxuICAgICAgd2l0aG91dENyZWRlbnRpYWxzOiB0cnVlLFxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGd0Q2hhdFdpZGdldDtcbn1cblxuLyoqXG4gKiBJZGVudGlmeSBpZiB2ZXJzaW9uIGlzIFY2XG4gKiBcbiAqIENvbGxhYm9yYXRvcnMgY29kZSBmb3IgVjUgb3IgVjYgaWRlbnRpZmljYXRpb25cbiAqIFxuICogXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Y2KCkge1xuICBsZXQgaXNWNiA9IGZhbHNlO1xuICBjb25zdCBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7IC8vIFBhcnNlIHF1ZXJ5IHN0cmluZ1xuICBjb25zdCBxdWVyeUVuYWJsZWQgPSBxdWVyeVBhcmFtcy5nZXQoXCJ2NlwiKSA9PT0gXCJ0cnVlXCI7IC8vIENoZWNrIGlmIHY2IGV4aXN0cyBhbmQgaXMgXCJ0cnVlXCJcbiAgY29uc3QgZGRvRW5hYmxlZCA9IEFycmF5LmlzQXJyYXkod2luZG93Py5kaWdpdGFsRGF0YT8ucGFnZT8ucGFnZUluZm8pXG4gICAgPyB3aW5kb3cuZGlnaXRhbERhdGEucGFnZS5wYWdlSW5mb1swXT8uYXR0cmlidXRlcz8uY2hhdD8udjZcbiAgICA6ICh3aW5kb3c/LmRpZ2l0YWxEYXRhPy5wYWdlPy5wYWdlSW5mbyBhcyB7IGF0dHJpYnV0ZXM/OiB7IGNoYXQ/OiB7IHY2PzogYm9vbGVhbiB9IH0gfSk/LmF0dHJpYnV0ZXM/LmNoYXQ/LnY2O1xuICBpZiAocXVlcnlFbmFibGVkIHx8IGRkb0VuYWJsZWQpIGlzVjYgPSB0cnVlO1xuICByZXR1cm4gaXNWNjtcbn1cblxuLyoqXG4gKiBnZXREb21haW5cbiAqIEZ1bmN0aW9uIGRlc2lnbmVkIHRvIGF1dG9tYXRlIHRoZSBVUkwgcHJvY2VzcyByZWdhcmRsZXNzIG9mIHNpdGUgb3IgbG9jYXRpb24gb2YgY2hhdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREb21haW4oKSB7XG4gIGNvbnN0IGlzUHJvZCA9IHdpbmRvdy5iYWN0bV9lbnZTZWxlY3RvciA9PT0gXCJwcm9kXCI7XG5cbiAgaWYgKCFpc1Byb2QpIHtcbiAgICBjb25zdCBlbnYgPSBxdWVyeVN0cmluZ1BhcnNlKFwiY2hhdEVudlwiKTtcbiAgICBpZiAoZW52ICE9PSBcIlwiKSByZXR1cm4gYGh0dHBzOi8vd3d3LSR7ZW52fS5lY25wLmJhbmtvZmFtZXJpY2EuY29tYDtcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhvc3QuaW5kZXhPZihcImxvY2FsaG9zdFwiKSA+IC0xKVxuICAgICAgcmV0dXJuIFwiaHR0cDovL2xvY2FsaG9zdDozMDA1XCI7XG4gIH1cblxuICBzd2l0Y2ggKHdoaWNoRG9tYWluKCkpIHtcbiAgICBjYXNlIEJPRkE6XG4gICAgICBpZiAoaXNQcm9kKSB7XG4gICAgICAgIHJldHVybiBcImh0dHBzOi8vd3d3LmJhbmtvZmFtZXJpY2EuY29tXCI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhvc3ROYW1lID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoaG9zdE5hbWUuaW5kZXhPZihcInNpdDFcIikgPiAtMSB8fCBob3N0TmFtZS5pbmRleE9mKFwicHJldmlldzFcIikgPiAtMSkge1xuICAgICAgICByZXR1cm4gXCJodHRwczovL3d3dy1zaXQxYS1oZWxpeC5lY25wLmJhbmtvZmFtZXJpY2EuY29tXCI7XG4gICAgICB9XG4gICAgICBpZiAoaG9zdE5hbWUuaW5kZXhPZihcInNpdDJcIikgPiAtMSB8fCBob3N0TmFtZS5pbmRleE9mKFwicHJldmlldzJcIikgPiAtMSkge1xuICAgICAgICByZXR1cm4gXCJodHRwczovL3d3dy1zaXQyYS1oZWxpeC5lY25wLmJhbmtvZmFtZXJpY2EuY29tXCI7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQk9GQV9ET01BSU5TLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuaW5kZXhPZihCT0ZBX0RPTUFJTlNbaV0pID4gLTEpIHtcbiAgICAgICAgICByZXR1cm4gYGh0dHBzOi8vd3d3LSR7Qk9GQV9ET01BSU5TW2ldfWVjbnAuYmFua29mYW1lcmljYS5jb21gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYGh0dHBzOi8vd3d3LSR7SVJfRU5WLkNFUlR9LWhlbGl4LmVjbnAuYmFua29mYW1lcmljYS5jb21gO1xuXG4gICAgY2FzZSBNRVJSSUxMOlxuICAgICAgaWYgKGlzUHJvZCkge1xuICAgICAgICBjb25zdCBtbERvbWFpbiA9IGdldEN1cnJlbnREb21haW4oKTtcbiAgICAgICAgcmV0dXJuIGBodHRwczovL2NoYXR1aS4ke21sRG9tYWlufWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7IGhvc3RuYW1lOiBobiB9ID0gd2luZG93LmxvY2F0aW9uO1xuICAgICAgICBjb25zdCB7IENFUlQsIERFViB9ID0gSVJfRU5WO1xuXG4gICAgICAgIGNvbnN0IGRldGVybWluZUNlcnQgPVxuICAgICAgICAgIGhuLmluY2x1ZGVzKFwicGwxXCIpIHx8XG4gICAgICAgICAgaG4uaW5jbHVkZXMoXCJwbDJcIikgfHxcbiAgICAgICAgICBobi5pbmNsdWRlcyhcInNpdDFcIikgfHxcbiAgICAgICAgICBobi5pbmNsdWRlcyhcInNpdDJcIik7XG5cbiAgICAgICAgaWYgKGhuLmluY2x1ZGVzKFwibWVycmlsbGVkZ2VzaXQxXCIpKVxuICAgICAgICAgIHJldHVybiBcImh0dHBzOi8vY2hhdHVpLm1lcnJpbGxlZGdlc2l0MS5jb21cIjtcbiAgICAgICAgaWYgKGhuLmluY2x1ZGVzKFwibWVycmlsbGVkZ2VzaXQyXCIpKVxuICAgICAgICAgIHJldHVybiBcImh0dHBzOi8vY2hhdHVpLm1lcnJpbGxlZGdlc2l0Mi5jb21cIjtcbiAgICAgICAgaWYgKGhuLmluY2x1ZGVzKFwiZnNzaXQxLm1sLmNvbVwiKSkgcmV0dXJuIFwiaHR0cHM6Ly9jaGF0dWkuZnNzaXQxLm1sLmNvbVwiO1xuICAgICAgICBpZiAoaG4uaW5jbHVkZXMoXCJmc3NpdDIubWwuY29tXCIpKSByZXR1cm4gXCJodHRwczovL2NoYXR1aS5mc3NpdDIubWwuY29tXCI7XG4gICAgICAgIGlmIChobi5pbmNsdWRlcyhcImJlbmVmaXRzc2l0Mi5tbC5jb21cIikpXG4gICAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9jaGF0dWkuYmVuZWZpdHNzaXQyLm1sLmNvbVwiO1xuICAgICAgICBpZiAoaG4uaW5jbHVkZXMoXCJiZW5lZml0c3NpdDEubWwuY29tXCIpKVxuICAgICAgICAgIHJldHVybiBcImh0dHBzOi8vY2hhdHVpLmJlbmVmaXRzc2l0MS5tbC5jb21cIjtcblxuICAgICAgICBpZiAoaG4uaW5jbHVkZXMoXCJzZWN1cmUtZGV2My5vbGRpZlwiKSlcbiAgICAgICAgICByZXR1cm4gXCJodHRwczovL2NoYXR1aS1kZXYzLm1sLmNvbVwiO1xuXG4gICAgICAgIGlmIChkZXRlcm1pbmVDZXJ0KSByZXR1cm4gYGh0dHBzOi8vY2hhdHVpLSR7Q0VSVH0ubWwuY29tYDtcbiAgICAgICAgcmV0dXJuIGBodHRwczovL2NoYXR1aS0ke0RFVn0ubWwuY29tYDtcbiAgICAgIH1cbiAgICBjYXNlIElOVEVSTkFMOlxuICAgICAgaWYgKGlzUHJvZCkge1xuICAgICAgICByZXR1cm4gXCJodHRwczovL3d3dy5iYW5rb2ZhbWVyaWNhLmNvbVwiO1xuICAgICAgfVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNhc2UtZGVjbGFyYXRpb25zXG4gICAgICBjb25zdCBpbnRFbnYgPVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuaW5jbHVkZXMoXCItdWF0XCIpIHx8XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLmluY2x1ZGVzKFwicWEuXCIpXG4gICAgICAgICAgPyBJUl9FTlYuQ0VSVFxuICAgICAgICAgIDogSVJfRU5WLkRFVjtcbiAgICAgIHJldHVybiBgaHR0cHM6Ly93d3ctJHtpbnRFbnZ9LWhlbGl4LmVjbnAuYmFua29mYW1lcmljYS5jb21gO1xuXG4gICAgY2FzZSBTUEFSVEE6XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY2FzZS1kZWNsYXJhdGlvbnNcbiAgICAgIGNvbnN0IHNwYXJ0YUVudiA9IHF1ZXJ5U3RyaW5nUGFyc2UoXCJlbnZpcm9ubWVudFwiKTtcbiAgICAgIGlmIChzcGFydGFFbnYgIT09IFwiXCIgJiYgc3BhcnRhRW52LnN0YXJ0c1dpdGgoXCJodHRwc1wiKSkgcmV0dXJuIHNwYXJ0YUVudjtcbiAgICAgIHJldHVybiBgaHR0cHM6Ly93d3ctJHtJUl9FTlYuREVWfS1oZWxpeC5lY25wLmJhbmtvZmFtZXJpY2EuY29tYDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGBodHRwczovL3d3dy0ke0lSX0VOVi5DRVJUfS1oZWxpeC5lY25wLmJhbmtvZmFtZXJpY2EuY29tYDtcbiAgfVxufVxuXG4vKipcbiAqIGlzRW1wdHlPYmpcbiAqIEZ1bmN0aW9uIGRlc2lnbmVkIHRvIGNoZWNrIGlmIGFuIG9iamVjdCBpcyBlbXB0eSAocmV0dXJucyB0cnVlKSBvciBjb250YWluc1xuICoga2V5L3ZhbHVlIHBhaXJzIChyZXR1cm5zIGZhbHNlKVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5T2JqKG9iajogb2JqZWN0KTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogaXNFbXB0eUFyclxuICogRnVuY3Rpb24gZGVzaWduZWQgdG8gY2hlY2sgaWYgYW4gYXJyYXkgaXMgZW1wdHkgKHJldHVybnMgdHJ1ZSkgb3IgY29udGFpbnMgaXRlbXMgKHJldHVybnMgZmFsc2UpXG4gKiBAcGFyYW0ge2FycmF5fSBhcnJcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eUFycihhcnI6IGFueVtdKTogYm9vbGVhbiB7XG4gIHJldHVybiAhKEFycmF5LmlzQXJyYXkoYXJyKSAmJiBhcnIubGVuZ3RoID09PSAwKTtcbn1cblxuLyoqXG4gKiBpc1NhbGVQcmVzZW50XG4gKiBGdW5jdGlvbiBkZXNpZ25lZCB0byBjaGVjayB0aHJvdWdoIHRoZSBkaWdpdGFsRGF0YSBvYmplY3QgZm9yIHRoZSBwcmVzZW5jZSBvZiBhbGwgdGhlXG4gKiBwb3NzaWJsZSBzYWxlIGluZGljYXRvcnNcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gZGRvIC0gdGhlIGRpZ2l0YWxEYXRhIG9iamVjdCBvbiB0aGUgd2luZG93XG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIGlmIGRlZmluZWRcbiAqIEByZXR1cm5zIHtudWxsfSAtIGlmIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTYWxlUHJlc2VudChkZG86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qgc2FsZUluZGljYXRvcnMgPVxuICAgIHdoaWNoRG9tYWluKCkgPT09IEJPRkEgPyBCT0ZBX1NBTEVfSU5ESUNBVE9SUyA6IE1MX1NBTEVfSU5ESUNBVE9SUztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYWxlSW5kaWNhdG9ycy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChcbiAgICAgIGRkb1tzYWxlSW5kaWNhdG9yc1tpXV0gJiZcbiAgICAgIGRkb1tzYWxlSW5kaWNhdG9yc1tpXV0gIT09IG51bGwgJiZcbiAgICAgIGRkb1tzYWxlSW5kaWNhdG9yc1tpXV0gIT09IFwiXCJcbiAgICApIHtcbiAgICAgIHJldHVybiBkZG9bc2FsZUluZGljYXRvcnNbaV1dO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBwcm94eUNoYXRERE9cbiAqIEZ1bmN0aW9uIGRlc2lnbmVkIHRvIHNldCBtdXRhdGlvbiBvYnNlcnZlciBvbiBERE9cbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmogLSBkZG8gb2JqZWN0IHRvIGJlIG9ic2VydmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIGtleSB2YWx1ZSB0aGF0IGlzIGxpc3RlbmVkIGZvclxuICogQHJldHVybiB7Ym9vbH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3h5Q2hhdERETyhvYmo6IG9iamVjdCwga2V5OiBzdHJpbmcpIHtcbiAgbGV0IG9sZFZhbHVlID0gb2JqW2tleV07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBvbGRWYWx1ZTtcbiAgICB9LFxuICAgIHNldChuZXdWYWx1ZSkge1xuICAgICAgbG9nR2VuZXN5c0V2ZW50KDIsIFwiQmFjdG0gUHJveHkgRERPIENoYW5nZVwiLCBgbmV3VmFsdWU6ICR7bmV3VmFsdWV9YCk7XG5cbiAgICAgIG9sZFZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgIGlmIChrZXkgPT09IFwiYXBwbGljYXRpb25JRFwiKSBrZXkgPSBJTlFfQ0xJRU5UX09SREVSX05VTTtcbiAgICAgIHNlbmRQcm94eVBvc3RNZXNzYWdlKGtleSwgbmV3VmFsdWUpO1xuICAgIH0sXG4gIH0pO1xufVxuLyoqXG4gKiBpbmNyZWFzZUVycm9yQ291bnRcbiAqIEZ1bmN0aW9uIGRlc2lnbmVkIHRvIGNvdW50IGV2ZXJ5IHRpbWUgdGhhdCBhbiBlcnJvciBvY2N1cnMuIE9uY2UgMyBlcnJvcnMgb2NjdXIsXG4gKiBwdWJsaXNoIHdpbGwgb2NjdXIgdG8gc2h1dGRvd24gY2hhdCBvbiB3aWRnZXQgYW5kIHNpdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluY3JlYXNlRXJyb3JDb3VudCgpIHtcbiAgaWYgKGJhY3RtICYmIGJhY3RtLmRkbykge1xuICAgIGxldCBlcnJvckNvdW50ID1cbiAgICAgIGJhY3RtLmRkby5nZXQoXCJwYWdlLmF0dHJpYnV0ZXMuY2hhdC5nZW5lc3lzX2Vycm9yX2NvdW50XCIpIHx8IDA7XG4gICAgZXJyb3JDb3VudCsrO1xuICAgIGJhY3RtLmRkby5zZXQoXCJwYWdlLmF0dHJpYnV0ZXMuY2hhdC5nZW5lc3lzX2Vycm9yX2NvdW50XCIsIGVycm9yQ291bnQpO1xuICAgIGlmIChlcnJvckNvdW50ID09PSBNQVhfRVJSX1JFVFJJRVMpIFRlYWxpdW1QdWJTdWIucHVibGlzaChDQU5DRUxfU0lURV9TVUJTKTtcbiAgfVxufVxuXG4vKipcbiAqIGdldEhvc3ROYW1lXG4gKiBFeHRyYWN0cyBob3N0bmFtZSBmcm9tIFVSTCBTdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgdG8gZXh0cmFjdCBob3N0bmFtZVxuICogQHJldHVybnMge3N0cmluZ30gaG9zdG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEhvc3ROYW1lKHVybDogc3RyaW5nKSB7XG4gIGNvbnN0IG1hdGNoID0gdXJsLm1hdGNoKC86XFwvXFwvKHd3d1swLTldP1xcLik/KC5bXi86XSspL2kpO1xuXG4gIGlmIChcbiAgICBtYXRjaCAhPSBudWxsICYmXG4gICAgbWF0Y2gubGVuZ3RoID4gMiAmJlxuICAgIHR5cGVvZiBtYXRjaFsyXSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIG1hdGNoWzJdLmxlbmd0aCA+IDBcbiAgKSB7XG4gICAgcmV0dXJuIG1hdGNoWzJdO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogZ2V0VG9wTGV2ZWxEb21haW5cbiAqIEV4dHJhY3QgVExEIGZyb20gVVJMIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IHVybCB0byBleHRyYWN0IHRsZFxuICogQHJldHVybnMge3N0cmluZ30gdG9wIGxldmVsIGRvbWFpblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9wTGV2ZWxEb21haW4odXJsOiBzdHJpbmcpIHtcbiAgY29uc3QgbWVycmlsbFRMRHMgPSBbXG4gICAgLy8gZ29lcyBmcm9tIG1vc3Qgc3BlY2lmaWMgdG8gbGVhc3Qgc3BlY2lmaWNcbiAgICBcIm1lcnJpbGxlZGdlc2l0MS5jb21cIixcbiAgICBcIm1lcnJpbGxlZGdlc2l0Mi5jb21cIixcbiAgICBcImZzc2l0MS5tbC5jb21cIixcbiAgICBcImZzc2l0Mi5tbC5jb21cIixcbiAgICBcImJlbmVmaXRzc2l0MS5tbC5jb21cIixcbiAgICBcImJlbmVmaXRzc2l0Mi5tbC5jb21cIixcbiAgICBcIm1sLmNvbVwiLFxuICAgIFwibWVycmlsbGVkZ2UuY29tXCIsXG4gIF07XG5cbiAgaWYgKHVybC5pbmNsdWRlcyhcImJhbmtvZmFtZXJpY2EuY29tXCIpIHx8IHVybC5pbmNsdWRlcyhcImxvY2FsaG9zdFwiKSlcbiAgICByZXR1cm4gXCJiYW5rb2ZhbWVyaWNhLmNvbVwiO1xuXG4gIHJldHVybiBtZXJyaWxsVExEcy5maWx0ZXIoKHRsZCkgPT4gdXJsLmluY2x1ZGVzKHRsZCkpWzBdO1xufVxuXG4vKipcbiAqIGdldEN1cnJlbnREb21haW5cbiAqIE9idGFpbnMgdGhlIGN1cnJlbnQgVExEIGRvbWFpbiBmcm9tIGN1cnJlbnQgd2luZG93LmxvY2F0aW9uLmhyZWZcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEN1cnJlbnQgVExEXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50RG9tYWluKCkge1xuICBpZiAod2luZG93LmxvY2F0aW9uLm9yaWdpbiA9PT0gXCJodHRwOi8vbG9jYWxob3N0OjQwMDBcIikge1xuICAgIHJldHVybiBcImxvY2FsaG9zdFwiO1xuICB9XG4gIHJldHVybiBnZXRUb3BMZXZlbERvbWFpbih3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbn1cblxuLyoqXG4gKiBQdWJsaXNoIHRvIHdpbmRvd1xuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIG5hbWUgb24gZXZlbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYXlsb2FkIC0gRXZlbnRzIHBheWxvYWRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVibGlzaFdpbmRvdyhldmVudE5hbWU6IHN0cmluZywgcGF5bG9hZD86IG9iamVjdCk6IGJvb2xlYW4ge1xuICB3aW5kb3cuc3BhcnRhLmNoYXQud2lkZ2V0TG9hZGVyLnB1YihldmVudE5hbWUsIHBheWxvYWQpO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUHVibGlzaCB0byBUZWFsaXVtXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIC0gbmFtZSBvbiBldmVudFxuICogQHBhcmFtIHtvYmplY3R9IHBheWxvYWQgLSBFdmVudHMgcGF5bG9hZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdWJsaXNoVGVhbGl1bShldmVudE5hbWU6IHN0cmluZywgcGF5bG9hZD86IG9iamVjdCk6IGJvb2xlYW4ge1xuICBUZWFsaXVtUHViU3ViLnB1Ymxpc2goZXZlbnROYW1lLCBwYXlsb2FkKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIERldGVybWluZSBDaGF0IEVudmlyb25tZW50XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVybWluZUNoYXRFbnYoKSB7XG4gIGlmICh3aW5kb3cuYmFjdG1fZW52U2VsZWN0b3IpIHJldHVybjtcbiAgaWYgKHdpbmRvdy5udWNsZXVzKSB7XG4gICAgd2luZG93LmJhY3RtX2VudlNlbGVjdG9yID0gd2luZG93Lm51Y2xldXMuc3RhdGUoKS50b0pTKCkuY21zXG4gICAgICAuZW52aXJvbm1lbnRWYXJpYWJsZXMuaXNQcm9kXG4gICAgICA/IFwicHJvZFwiXG4gICAgICA6IFwibm90cHJvZFwiO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5iYWN0bV9lbnZTZWxlY3RvciA9IFwibm90cHJvZFwiO1xuICB9XG59XG5cbi8qKlxuICogTG9nIEdlbmVzeXMgRXZlbnRcbiAqIEBwYXJhbSB7ZXZlbnROYW1lfSAtIE5hbWUgb2YgdGhlIGdlbmVzeXMgZXZlbnRcbiAqIEBwYXJhbSB7aW5mb30gLSAgT3RoZXIgaW5mb3JtYXRpb24gdGhhdCBuZWVkcyB0byBiZSBjb2xsZWN0ZWRcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nR2VuZXN5c0V2ZW50KFxuICBsZXZlbE51bTogbnVtYmVyLFxuICBldmVudE5hbWU6IHN0cmluZyxcbiAgZGF0YTogb2JqZWN0IHwgc3RyaW5nIHwgdW5rbm93blxuKSB7XG4gIGlmICh3aW5kb3cuYmFjdG1fZW52U2VsZWN0b3IgPT09IFwicHJvZFwiKSByZXR1cm47XG4gIGlmICghd2luZG93LmJhY3RtKSB7XG4gICAgd2luZG93LmJhY3RtID0ge307XG4gICAgd2luZG93LmJhY3RtLmNoYXRfZGF0YUNvbGxlY3RvciA9IFtdO1xuICB9XG5cbiAgY29uc3QgbGV2ZWxOdW1FdmVudHMgPSB7XG4gICAgMTogXCJpbmZvXCIsXG4gICAgMjogXCJ3YXJuXCIsXG4gICAgMzogXCJlcnJvclwiLFxuICB9O1xuXG4gIGNvbnN0IGxldmVsID0gbGV2ZWxOdW1FdmVudHNbbGV2ZWxOdW1dO1xuXG4gIGNvbnN0IG5ld0V2ZW50ID0ge1xuICAgIGV2ZW50TmFtZSxcbiAgICBkYXRhLFxuICB9O1xuXG4gIGNvbnN0IGRlYnVnQ2hhdCA9IHF1ZXJ5U3RyaW5nUGFyc2UoXCJkZWJ1Z0NoYXRcIik7XG4gIGlmIChkZWJ1Z0NoYXQgPT09IFwiMVwiKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKGBCYWN0bSBHZW5lc3lzIENoYXQgLSAke2V2ZW50TmFtZX1gKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUuaW5mbyh7IGRhdGEsIGxldmVsIH0pO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5ncm91cEVuZCgpO1xuICB9XG5cbiAgd2luZG93LmJhY3RtLmNoYXRfZGF0YUNvbGxlY3Rvci5wdXNoKHsgbGV2ZWwsIG5ld0V2ZW50IH0pO1xufVxuXG4vLyAvKipcbi8vICAqIGNoZWNrSWZOYXRpdmVcbi8vICAqIENoZWNrcyBxdWVyeXN0cmluZyBmb3IgbmF0aXZlQ2hhdCBmbGFnXG4vLyAgKiBAcmV0dXJucyB7c3RyaW5nfVxuLy8gICovXG4vLyBleHBvcnQgY29uc3QgY2hlY2tJZk5hdGl2ZUNoYXQgPSAocGFyZW50V2luZG93ID0gd2luZG93LnBhcmVudCkgPT4ge1xuLy8gICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhcmVudFdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuLy8gICBjb25zdCBiYWN0bUNvb2tpZXMgPSBuZXcgYmFjdG0uQ29va2llcygpXG4vLyAgIGNvbnN0IGNoZWNrQ29va2llID0gYmFjdG1Db29raWVzLmdldCgnb2NjdENoYXQnKTtcbi8vICAgY29uc3Qgb2NjdENoYXRDb29raWUgPSBjaGVja0Nvb2tpZSA/IEpTT04ucGFyc2UoY2hlY2tDb29raWUpIDogXCJcIjtcblxuLy8gICByZXR1cm4gdXJsUGFyYW1zLmdldChcIm5hdGl2ZUNoYXRcIikgPT09IG51bGxcbi8vICAgPyAob2NjdENoYXRDb29raWUubmF0aXZlQ2hhdFxuLy8gICAgICAgPyBvY2N0Q2hhdENvb2tpZS5uYXRpdmVDaGF0XG4vLyAgICAgICAgIDogXCJcIilcbi8vICAgOiB1cmxQYXJhbXMuZ2V0KFwibmF0aXZlQ2hhdFwiKS50b0xvd2VyQ2FzZSgpXG5cbi8vIH07XG5cbi8vIC8qKlxuLy8gICogY2hlY2tDaGF0SURcbi8vICAqIENoZWNrcyBxdWVyeXN0cmluZyBmb3IgY2hhdElEIGZsYWdcbi8vICAqIEByZXR1cm5zIHtzdHJpbmd9XG4vLyAgKi9cbi8vIGV4cG9ydCBjb25zdCBjaGVja0NoYXRJRCA9IChwYXJlbnRXaW5kb3cgPSB3aW5kb3cucGFyZW50KSA9PiB7XG4vLyAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyZW50V2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4vLyAgIGNvbnN0IGJhY3RtQ29va2llcyA9IG5ldyBiYWN0bS5Db29raWVzKClcbi8vICAgY29uc3QgY2hlY2tDb29raWUgPSBiYWN0bUNvb2tpZXMuZ2V0KCdvY2N0Q2hhdCcpO1xuLy8gICBjb25zdCBvY2N0Q2hhdENvb2tpZSA9IGNoZWNrQ29va2llID8gSlNPTi5wYXJzZShjaGVja0Nvb2tpZSkgOiBcIlwiO1xuLy8gICByZXR1cm4gdXJsUGFyYW1zLmdldCgnY2hhdElEJykgPT09IG51bGxcbi8vICAgPyAob2NjdENoYXRDb29raWUuY2hhdElEXG4vLyAgICAgICA/IG9jY3RDaGF0Q29va2llLmNoYXRJRFxuLy8gICAgICAgICA6ICcnKVxuLy8gICA6IHVybFBhcmFtcy5nZXQoJ2NoYXRJRCcpO1xuLy8gfTtcblxuZXhwb3J0IGNvbnN0IGNoZWNrV3JhcCA9IChwYXJlbnRXaW5kb3cgPSB3aW5kb3cucGFyZW50KSA9PiB7XG4gIHJldHVybiB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcyhcIndyYXA9TURBXCIpID8gXCJZXCIgOiBcIk5cIjtcbn07XG4vKipcbiAqIGdldEdTSURcbiAqIEByZXR1cm5zIG51bGwgfHwgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHU0lEKCkge1xuICBjb25zdCBnc2lkID0gZ2V0Q29va2llU3RvcmFnZShDT09LSUVfR1NJRCk7XG4gIGlmIChpc0VtcHR5T2JqKGdzaWQpKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgcmV0dXJuIGdzaWQ7XG59XG5cbi8qKlxuICogc2V0cyByZWZpZCBjb29raWUgZm9yIHRlc3RpbmdcbiAqIEByZXR1cm5zIHZvaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vY2tSZWZJRCgpOiB2b2lkIHtcbiAgaWYgKHdpbmRvdy5iYWN0bV9lbnZTZWxlY3RvciA9PT0gXCJub3Rwcm9kXCIpIHtcbiAgICBjb25zdCBtb2NrUmVmSUQgPSBuZXcgYmFjdG0uUXVlcnlTdHJpbmcod2luZG93LmxvY2F0aW9uLmhyZWYpPy5fY2FjaGVcbiAgICAgID8ubW9ja1JlZklEO1xuICAgIGlmIChtb2NrUmVmSUQpIHtcbiAgICAgIHNldENvb2tpZVN0b3JhZ2UoXG4gICAgICAgIHsgbW9ja1JlZklEIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBOQU1FOiBcIm1vY2tSZWZJRFwiLFxuICAgICAgICAgIEVYUElSQVRJT046IDEwLFxuICAgICAgICAgIERPTUFJTjogXCIuYmFua29mYW1lcmljYS5jb21cIixcbiAgICAgICAgICBTRUNVUkU6IHRydWUsXG4gICAgICAgICAgUEFUSDogXCIvXCIsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxc0xvYlNldHRlcigpOiB2b2lkIHtcbiAgY29uc3Qgc2JJbmRpY2F0b3JzID0gW1wiY3VzdG9tZXJfbG9iPXNib2JcIiwgXCJzYmZsb3c9eVwiLCBcInN1YkNoYW5uZWw9U0JDTE9cIl07XG4gIGNvbnN0IGNvbnN1bWVySW5kaWNhdG9ycyA9IFtcImN1c3RvbWVyX2xvYj1jb1wiXTtcbiAgY29uc3QgZ3dpbVVzdHJ1c3RJbmRpY2F0b3JzID0gW107XG4gIGxldCBpc1NCUGFnZSA9IGZhbHNlO1xuICBjb25zdCBiYWN0bUNvb2tpZXMgPSBuZXcgYmFjdG0uQ29va2llcygpO1xuICBjb25zdCBzYkNvb2tpZSA9IGJhY3RtQ29va2llcy5nZXQoXCJpc1NCQ3VzdG9tZXJcIik7XG4gIGlmIChcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcyhcIi9zZWN1cmUtYXV0aHNhbGVzLWVjbG8vZWNsby1yZXN1bHRzLWF1dGgvXCIpXG4gICkge1xuICAgIGlzU0JQYWdlID0gc2JDb29raWUgPT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cbiAgY29uc3Qgc21CdXNJbmRpY2F0b3JzRm91bmQgPSBzYkluZGljYXRvcnMuZmlsdGVyKChpbmRpY2F0b3IpID0+XG4gICAgd2luZG93LmxvY2F0aW9uLnNlYXJjaC5pbmNsdWRlcyhpbmRpY2F0b3IpXG4gICk7XG4gIGNvbnN0IGlzU21hbGxCdXNpbmVzcyA9IHNtQnVzSW5kaWNhdG9yc0ZvdW5kLmxlbmd0aCA+IDA7XG4gIGlmIChpc1NtYWxsQnVzaW5lc3MgfHwgaXNTQlBhZ2UpIHtcbiAgICBkaWdpdGFsRGF0YS5wYWdlLmF0dHJpYnV0ZXMuY2hhdC5jdXN0b21lcl9sb2IgPSBcInNib2JcIjtcbiAgfVxufVxuXG4vKipcbiAqIElzIFVuaXZlcnNhbCBIZWFkZXJcbiAqXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1VuaXZlcnNhbEhlYWRlcigpOiBib29sZWFuIHtcbiAgY29uc3QgJHVuaXZlcnNhbEhlYWRlck1vZHVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidW5pdmVyc2FsSGVhZGVyTW9kdWxlXCIpO1xuICByZXR1cm4gZG9jdW1lbnQuYm9keS5jb250YWlucygkdW5pdmVyc2FsSGVhZGVyTW9kdWxlKTtcbn1cbiIsIi8vIEB0cy1ub2NoZWNrXG5cbi8qKiBAbW9kdWxlIHdpZGdldC1hcGkvYWdlbnQtaW5jZW50aXZlICovXG5pbXBvcnQge1xuICBHRU5FU1lTX1FVQUxJRklFRF9MRUFELFxuICBQSVhFTF9UQUdfVVJMLFxufSBmcm9tICcuLi93aWRnZXQtY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIGlzTWVycmlsbCxcbiAgaW5jcmVhc2VFcnJvckNvdW50LFxuICBsb2dHZW5lc3lzRXZlbnQsXG59IGZyb20gJy4uL3V0aWxpdGllcy91dGlsaXRpZXMnO1xuXG4vKipcbiAqIEdlbmVzeXMgUXVhbGlmaWVkIExlYWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhZ2VudElEIC0gZW5jcnlwdGVkIE5CS0lEIGZvciB0aGUgYWdlbnRcbiAqIEBkZXNjIC0gR2VuZXN5cyBzZW5kcyBhbiBlbmNyeXB0ZWQgTkJLSUQgb25jZSB0aGUgY2hhdCBoYXMgbWFkZSBhIHF1YWxpZmllZCBsZWFkLlxuICogVGhpcyBmdW5jdGlvbiBzdG9yZXMgdGhlIGVuY3J5cHRlZCBJRCBhcyBhIGNvb2tpZSBzbyBpdCBjYW4gYmUgY29sbGVjdGVkIGJ5IEFCUEEgb25jZSBhIHNhbGVcbiAqIGhhcyBvY2N1cnJlZFxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2VuZXN5c0FnZW50UXVhbGlmaWVkTGVhZChldmVudE5hbWU6IHN0cmluZywgeyBhZ2VudElEIH06IHsgYWdlbnRJRDogc3RyaW5nfSkge1xuICBsb2dHZW5lc3lzRXZlbnQoMSwgR0VORVNZU19RVUFMSUZJRURfTEVBRCwgeyBhZ2VudElEIH0pO1xuICB0cnkge1xuICAgIGNvbnN0IGFnZW50TFRTID0gYmFjdG0uU3RvcmUoJ2NoYXQnLCB7IHR5cGU6ICdjb29raWUnIH0pO1xuICAgIGlmIChpc01lcnJpbGwoKSkge1xuICAgICAgYWdlbnRMVFMuY2xlYXIoKTtcbiAgICB9XG4gICAgLy8gdGhpcyBzZXRzIGJhY3RtX2x0cyBjb29raWUgY2VydGFpbiBzYWxlcyBmbG93IGNoZWNrIHRoZSBiYWN0bV9sdHMgY29va2llIHJhdGhlciB0aGFuIHRoZSBvY2N0Q2hhdF9sdHMgY29va2llXG4gICAgYWdlbnRMVFMuc2V0KCdzZWN1cmVBZ2VudElEJywgYWdlbnRJRCk7XG4gICAgYWdlbnRMVFMuc2F2ZSgpO1xuICAgIGRpZ2l0YWxEYXRhLnBhZ2UuYXR0cmlidXRlcy5jaGF0LmFnZW50X2lkID0gYWdlbnRMVFMuZ2V0KCdzZWN1cmVBZ2VudElEJyk7XG4gICAgZGlnaXRhbERhdGEucGFnZS5hdHRyaWJ1dGVzLmNoYXQuc2FsZV9vY2N1cnJlZCA9IGZhbHNlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nR2VuZXN5c0V2ZW50KDMsICdHZW5lc3lzIEFnZW50IFF1YWxpZmllZCBMZWFkIEVycm9yJywgZSk7XG4gICAgaWYgKGJhY3RtICYmIGJhY3RtLnBsdWdpbnMgJiYgYmFjdG0ucGx1Z2lucy5waXhlbFRhZykgYmFjdG0ucGx1Z2lucy5waXhlbFRhZy5maXJlUGl4ZWxUYWcoYCR7UElYRUxfVEFHX1VSTH0/ZXJyb3I9JHtlfWApO1xuICAgIGluY3JlYXNlRXJyb3JDb3VudCgpO1xuICB9XG59XG4iLCIvLyBAdHMtbm9jaGVja1xuXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqIEBtb2R1bGUgd2lkZ2V0LWFwaS9jby1icm93c2UgKi9cbmltcG9ydCB7XG4gIEdFTkVTWVNfQ09CUk9XU0VfQ09ORklHVVJFRCxcbiAgUElYRUxfVEFHX1VSTCxcbn0gZnJvbSAnLi4vd2lkZ2V0LWNvbnN0YW50cyc7XG5pbXBvcnQgeyBcbiAgaW5jcmVhc2VFcnJvckNvdW50LFxuICBsb2dHZW5lc3lzRXZlbnQsXG59IGZyb20gJy4uL3V0aWxpdGllcy91dGlsaXRpZXMnO1xuXG4vKipcbiAqIENvIGJyb3dzZVxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIG5hbWUgb2YgZXZlbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWd1cmF0aW9uXG4gKiBUT0RPIGh0dHA6Ly9sb2NhbGhvc3Q6NDAwMC9zcGFydGEtZGVtby9jaGF0LXdpZGdldC1kZW1vL3VuZGVmaW5lZGpzL2djYi5taW4uanMgdW5kZWZpbmVkIGlzIGVudkNvYnJvd3NlVVJMXG4gKiBUT0RPIENvYnJvd3NlIGNvbmZpZ3VyYXRpb24gaW5jb3JyZWN0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChldmVudE5hbWU6IHN0cmluZywgY29uZmlndXJhdGlvbjogeyBlbnZDb2Jyb3dzZVVSTDogc3RyaW5nIH0pIHtcbiAgdHJ5IHtcbiAgICBsb2dHZW5lc3lzRXZlbnQoMSwgJ0dlbmVzeXMgQ29icm93c2UgQ29uZmlndXJhdGlvbicsIGNvbmZpZ3VyYXRpb24pO1xuICAgIChmdW5jdGlvbiAoZCwgcywgaWQsIG8pIHtcbiAgICAgIGxldCBmcyA9IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUocylbMF07IHZhciBcbmU7XG4gICAgICBpZiAoZC5nZXRFbGVtZW50QnlJZChpZCkpIHJldHVybjtcbiAgICAgIGUgPSBkLmNyZWF0ZUVsZW1lbnQocykgYXMgSFRNTFNjcmlwdEVsZW1lbnQ7IGUuaWQgPSBpZDsgZS5zcmMgPSBvLnNyYztcbiAgICAgIGUuc2V0QXR0cmlidXRlKCdkYXRhLWdjYi11cmwnLCBvLmNiVXJsKTtcbiAgICAgIGZzLnBhcmVudE5vZGU/Lmluc2VydEJlZm9yZShlLCBmcyk7XG4gICAgfShkb2N1bWVudCwgJ3NjcmlwdCcsICdnZW5lc3lzLWpzJywge1xuICAgICAgICAgICAgc3JjOiBgJHtjb25maWd1cmF0aW9uLmVudkNvYnJvd3NlVVJMfWpzL2djYi5taW4uanNgLFxuICAgICAgICAgICAgY2JVcmw6IGNvbmZpZ3VyYXRpb24uZW52Q29icm93c2VVUkxcbiAgICAgICAgfSkpO1xuICAgIHdpbmRvdy5fZ2VuZXN5cyA9IGNvbmZpZ3VyYXRpb247XG4gICAgVGVhbGl1bVB1YlN1Yi5wdWJsaXNoKEdFTkVTWVNfQ09CUk9XU0VfQ09ORklHVVJFRCwgY29uZmlndXJhdGlvbik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dHZW5lc3lzRXZlbnQoMywgJ0dlbmVzeXMgQ29icm93c2UgRXJyb3InLCBlKTtcbiAgICBpZiAoYmFjdG0gJiYgYmFjdG0ucGx1Z2lucyAmJiBiYWN0bS5wbHVnaW5zLnBpeGVsVGFnKSBiYWN0bS5wbHVnaW5zLnBpeGVsVGFnLmZpcmVQaXhlbFRhZyhgJHtQSVhFTF9UQUdfVVJMfT9lcnJvcj0ke2V9YCk7XG4gICAgaW5jcmVhc2VFcnJvckNvdW50KCk7XG4gIH1cbn1cbiIsIi8vIEB0cy1ub2NoZWNrXG4vKiogQG1vZHVsZSB3aWRnZXQtYXBpL2NvbmZpZ3VyZS1jb2Jyb3dzZSAqL1xuaW1wb3J0IHtcbiAgZ2V0Q3VycmVudERvbWFpbixcbiAgcHVibGlzaFRlYWxpdW0sXG4gIGlzVjYsXG4gIHdoaWNoVmVyc2lvbixcbn0gZnJvbSAnLi4vdXRpbGl0aWVzL3V0aWxpdGllcyc7XG5pbXBvcnQgeyBHRU5FU1lTX0NPQlJPV1NFX0NPTkZJR1VSQVRJT04gfSBmcm9tICcuLi93aWRnZXQtY29uc3RhbnRzJztcblxuLyoqXG4gKiBIYW5kbGUgY29icm93c2VcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYXlsb2FkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaGFuZGxlQ29uZmlndXJlQ29icm93c2UocGF5bG9hZDogeyBkZXRhaWw6IG9iamVjdCB8IHVuZGVmaW5lZDsgfSkge1xuICBjb25zdCB2NiA9IGlzVjYoKTtcbiAgY29uc3Qgd2hpY2hDaGF0ID0gdjYgPyAnZ3QtY2hhdC13aWRnZXQnOiAnd3d3LWNoYXQnO1xuICBjb25zdCB3aWRnZXRWZXJzaW9uID0gd2hpY2hWZXJzaW9uKCk7XG4gIGNvbnN0IGN1cnJlbnRUTEQgPSBnZXRDdXJyZW50RG9tYWluKCk7XG4gIHB1Ymxpc2hUZWFsaXVtKEdFTkVTWVNfQ09CUk9XU0VfQ09ORklHVVJBVElPTixcbiAgICB7IC4uLnBheWxvYWQuZGV0YWlsLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgIGVudkNvYnJvd3NlVVJMOiBzcGFXaWRnZXRQYXJhbXNbd2hpY2hDaGF0XVt3aWRnZXRWZXJzaW9uXS5zaXRlUGFyYW1zLmRvbWFpbnNbY3VycmVudFRMRF0uY29icm93c2UsXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwiLy8gQHRzLW5vY2hlY2tcbi8qKiBAbW9kdWxlIHdpZGdldC1hcGkvc2VuZC1kaXNwb3NpdGlvbi1jb2RlICovXG5pbXBvcnQge1xuICBHV0VfU0VORF9ESVNQT1NJVElPTl9DT0RFX0ZBSUxVUkUsXG4gIEdFTkVTWVNfU1VTUEVORF9NT05JVE9SSU5HLFxuICBQSVhFTF9UQUdfVVJMLFxufSBmcm9tICcuLi93aWRnZXQtY29uc3RhbnRzJztcblxuaW1wb3J0IHtcbiAgZ2V0Q3VycmVudERvbWFpbixcbiAgd2hpY2hWZXJzaW9uLFxuICBpbmNyZWFzZUVycm9yQ291bnQsXG4gIGxvZ0dlbmVzeXNFdmVudCxcbiAgaXNWNlxufSBmcm9tICcuLi91dGlsaXRpZXMvdXRpbGl0aWVzJztcblxuLyoqXG4gKiBHV0UgQ2hhdCBEaXNwb3NpdGlvbiBSZXNwb25zZSAtIEZhaWx1cmVcbiAqIEBkZXNjIFVwb24gZmFpbHVyZSwgZnVuY3Rpb24gZGVsaXZlcnMgYSBQdWIvU3ViIGV2ZW50IHRvIHNlbmQgZXJyb3IgaW5mb3JtYXRpb24gYmFjayB0byBVSVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmVTZW5kRGlzcG9zaXRpb25Db2RlKGRpc3Bvc2l0aW9uUmVzcG9uc2U6IHVua25vd24pIHtcbiAgVGVhbGl1bVB1YlN1Yi5wdWJsaXNoKEdXRV9TRU5EX0RJU1BPU0lUSU9OX0NPREVfRkFJTFVSRSwgZGlzcG9zaXRpb25SZXNwb25zZSk7XG4gIGlmIChiYWN0bSAmJiBiYWN0bS5wbHVnaW5zICYmIGJhY3RtLnBsdWdpbnMucGl4ZWxUYWcpIGJhY3RtLnBsdWdpbnMucGl4ZWxUYWcuZmlyZVBpeGVsVGFnKGAke1BJWEVMX1RBR19VUkx9P2Vycm9yPSR7ZGlzcG9zaXRpb25SZXNwb25zZX1gKTtcbiAgbG9nR2VuZXN5c0V2ZW50KDMsICdTdXJ2ZXkgUmVzcG9uc2UgRmFpbHVyZScsIGRpc3Bvc2l0aW9uUmVzcG9uc2UpO1xuICBpbmNyZWFzZUVycm9yQ291bnQoKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEdXRSBDaGF0IERpc3Bvc2l0aW9uIFJlc3BvbnNlXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcGFyYW0ge29iamVjdH0gcGF5bG9hZFxuICogQGRlc2MgVGhlIGZvbGxvd2luZyBtZXRob2Qgd2lsbCBzZW5kIHRoZSBjdXN0b21lciByZXNwb25zZSB0byBhIHByb2FjdGl2ZSBjaGF0IHJlcXVlc3RcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChldmVudE5hbWU6IGFueSwgcGF5bG9hZDogeyByZXN1bHQ6IHN0cmluZywgZW5nYWdlbWVudElEOiBzdHJpbmcsIHBhZ2VJRDogc3RyaW5nLCB2aXNpdElEOiBzdHJpbmcgfSkge1xuICB0cnkge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlc3VsdCwgZW5nYWdlbWVudElELCBwYWdlSUQsIHZpc2l0SUQsXG4gICAgfSA9IHBheWxvYWQ7XG4gICAgY29uc3Qgd2lkZ2V0VmVyc2lvbiA9IHdoaWNoVmVyc2lvbigpO1xuICAgIGNvbnN0IHY2ID0gaXNWNigpO1xuICAgIGNvbnN0IHdoaWNoQ2hhdCA9IHY2ID8gJ2d0LWNoYXQtd2lkZ2V0JyA6ICd3d3ctY2hhdCc7XG4gICAgY29uc3QgY3VycmVudFRMRCA9IGdldEN1cnJlbnREb21haW4oKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgIGNvbnN0IGludml0ZVVSTCA9IHNwYVdpZGdldFBhcmFtc1t3aGljaENoYXRdW3dpZGdldFZlcnNpb25dLnNpdGVQYXJhbXMuZG9tYWluc1tjdXJyZW50VExEXS5tb25pdG9yaW5nanM7XG4gICAgY29uc3Qgc2VuZERpc3Bvc2l0aW9uVXJsID0gYCR7aW52aXRlVVJMfS9zZXJ2ZXIvZGF0YS9pbnZpdGVzLz9yZXN1bHQ9JHtyZXN1bHR9JmVuZ2FnZW1lbnRJRD0ke2VuZ2FnZW1lbnRJRH0mcGFnZUlEPSR7cGFnZUlEfSZ2aXNpdElEPSR7dmlzaXRJRH1gO1xuICAgIGxvZ0dlbmVzeXNFdmVudCgxLCAnQ2hhdCBEaXNwb3NpdGlvbiBDb2RlJywgcGF5bG9hZCk7XG4gICAgZmV0Y2goc2VuZERpc3Bvc2l0aW9uVXJsLCB7XG4gICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgfSk7XG4gICAgVGVhbGl1bVB1YlN1Yi5wdWJsaXNoKEdFTkVTWVNfU1VTUEVORF9NT05JVE9SSU5HKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dHZW5lc3lzRXZlbnQoMywgJ0dlbmVzeXMgU3VydmV5IEVycm9yJywgZXJyb3IpO1xuICAgIGZhaWx1cmVTZW5kRGlzcG9zaXRpb25Db2RlKGVycm9yKTtcbiAgfVxufVxuIiwiLy8gQHRzLW5vY2hlY2tcblxuLyoqIEBtb2R1bGUgYmFzZS93aWRnZXQtY29uc3RhbnRzICovXG5cbi8qKlxuICogV2lkZ2V0IGNvbnN0YW50c1xuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IE1PTklUT1JJTkdKU19SRVFVRVNUID0gJ01PTklUT1JJTkdKU19SRVFVRVNUJztcbmV4cG9ydCBjb25zdCBNT05JVE9SSU5HSlNfSEVBUlRCRUFUID0gJ01PTklUT1JJTkdKU19IRUFSVEJFQVQnO1xuZXhwb3J0IGNvbnN0IE1PTklUT1JJTkdfQ0xFQVJfSEVBUlRCRUFUID0gJ01PTklUT1JJTkdfQ0xFQVJfSEVBUlRCRUFUJztcbmV4cG9ydCBjb25zdCBDT01FVERfTUVUQV9ESVNDT05ORUNUID0gJ0NPTUVURF9NRVRBX0RJU0NPTk5FQ1QnO1xuZXhwb3J0IGNvbnN0IFBNX1NFTkRfU0FMRV9PQ0NVUlJFRCA9ICdQTV9TRU5EX1NBTEVfT0NDVVJSRUQnO1xuZXhwb3J0IGNvbnN0IEdFTkVTWVNfQ0hFQ0tfRk9SX1NBTEUgPSAnR0VORVNZU19DSEVDS19GT1JfU0FMRSc7XG5leHBvcnQgY29uc3QgR0VORVNZU19RVUFMSUZJRURfTEVBRCA9ICdHRU5FU1lTX1FVQUxJRklFRF9MRUFEJztcblxuLyoqXG4gKiBHZW5lc3lzIGNvbmZpZ3VyYXRpb25zICYgcmVxdWVzdCBjb25zdGFudHNcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBHRU5FU1lTX0NPQlJPV1NFX0NPTkZJR1VSRUQgPSAnR0VORVNZU19DT0JST1dTRV9DT05GSUdVUkVEJztcbmV4cG9ydCBjb25zdCBHRU5FU1lTX0NPQlJPV1NFX0NPTkZJR1VSQVRJT04gPSAnR0VORVNZU19DT0JST1dTRV9DT05GSUdVUkFUSU9OJztcblxuLyoqXG4gKiBHV0Ugc2VuZCBkaXNwb3NpdGlvbiByZXF1ZXN0LCBzdWNjZXNzLCAmIGZhaWx1cmUgY29uc3RhbnRzXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgR1dFX1NFTkRfRElTUE9TSVRJT05fQ09ERSA9ICdHV0VfU0VORF9ESVNQT1NJVElPTl9DT0RFJztcbmV4cG9ydCBjb25zdCBHV0VfU0VORF9ESVNQT1NJVElPTl9DT0RFX1NVQ0NFU1MgPSAnR1dFX1NFTkRfRElTUE9TSVRJT05fQ09ERV9TVUNDRVNTJztcbmV4cG9ydCBjb25zdCBHV0VfU0VORF9ESVNQT1NJVElPTl9DT0RFX0ZBSUxVUkUgPSAnR1dFX1NFTkRfRElTUE9TSVRJT05fQ09ERV9GQUlMVVJFJztcblxuLyoqXG4gKiBQb3N0IE1lc3NhZ2UgQ29uc3RhbnRzXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgQ0FOQ0VMX0hFQVJUQkVBVCA9ICdDQU5DRUxfSEVBUlRCRUFUJztcbmV4cG9ydCBjb25zdCBDQU5DRUxfV0lER0VUX1NVQlMgPSAnQ0FOQ0VMX1dJREdFVF9TVUJTJztcbmV4cG9ydCBjb25zdCBDQU5DRUxfU0lURV9TVUJTID0gJ0NBTkNFTF9TSVRFX1NVQlMnO1xuZXhwb3J0IGNvbnN0IENIRUNLX0FIX1RPS0VOID0gJ0NIRUNLX0FIX1RPS0VOJztcbmV4cG9ydCBjb25zdCBDSEVDS19GT1JfU0FMRSA9ICdDSEVDS19GT1JfU0FMRSc7XG5leHBvcnQgY29uc3QgR1JBQl9IRUFSVEJFQVRfREFUQSA9ICdHUkFCX0hFQVJUQkVBVF9EQVRBJztcbmV4cG9ydCBjb25zdCBTRVRfTU9OSVRPUklOR19TVEFUVVMgPSAnU0VUX01PTklUT1JJTkdfU1RBVFVTJztcbmV4cG9ydCBjb25zdCBTRU5EX1BST1hZX0RBVEEgPSAnU0VORF9QUk9YWV9EQVRBJztcbmV4cG9ydCBjb25zdCBNQVhfRVJSX1JFVFJJRVMgPSAzO1xuXG4vKipcbiAqIHJlc3BvbnNlIGZhaWx1cmVzIGNvbnN0YW50c1xuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IE1PTklUT1JJTkdKU19SRVNQT05TRV9GQUlMVVJFID0gJ01PTklUT1JJTkdKU19SRVNQT05TRV9GQUlMVVJFJztcbmV4cG9ydCBjb25zdCBNT05JVE9SSU5HSlNfSEVBUlRCRUFUX0ZBSUxVUkUgPSAnTU9OSVRPUklOR0pTX0hFQVJUQkVBVF9GQUlMVVJFJztcblxuLyoqXG4gKiByZXNwb25zZSBzdWNjZXNzIGNvbnN0YW50c1xuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IE1PTklUT1JJTkdKU19SRVNQT05TRSA9ICdNT05JVE9SSU5HSlNfUkVTUE9OU0UnO1xuZXhwb3J0IGNvbnN0IE1PTklUT1JJTkdfSURfUkVTUE9OU0UgPSAnTU9OSVRPUklOR19JRF9SRVNQT05TRSc7XG5cbi8qKlxuICogY2hhdCAmIHdpZGdldCBjb25zdGFudHNcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBzcGFydGFMb2FkZXJMb2FkZWQgPSAnc3BhcnRhTG9hZGVyTG9hZGVkJztcbmV4cG9ydCBjb25zdCBlcnJvckxvYWRpbmdXaWRnZXQgPSAnZXJyb3JMb2FkaW5nV2lkZ2V0JztcbmV4cG9ydCBjb25zdCBDSEFUX0lOSVRJQUxJWkFUSU9OID0gJ0NIQVRfSU5JVElBTElaQVRJT04nO1xuZXhwb3J0IGNvbnN0IFdJREdFVF9SRVFVRVNUX0NPTkZJR1VSQVRJT04gPSAnV0lER0VUX1JFUVVFU1RfQ09ORklHVVJBVElPTic7XG5leHBvcnQgY29uc3QgU1BBUlRBX1dJREdFVF9SRUFEWSA9ICdTUEFSVEFfV0lER0VUX1JFQURZLnNwYXJ0YVdpZGdldFV0aWxpdHknO1xuZXhwb3J0IGNvbnN0IFdJREdFVF9SRVFVRVNUX0NPTkZJR1VSQVRJT05fRVJST1IgPSAnV0lER0VUX1JFUVVFU1RfQ09ORklHVVJBVElPTl9FUlJPUic7XG5leHBvcnQgY29uc3QgV0lER0VUX1JFUVVFU1RfQ09ORklHVVJBVElPTl9TVUNDRVNTRlVMID0gJ1dJREdFVF9SRVFVRVNUX0NPTkZJR1VSQVRJT05fU1VDQ0VTU0ZVTCc7XG5cbi8qKlxuICogZ2VuZXN5cyBmZXRjaCBzZXNzaW9uIGNvbnN0YW50c1xuICogdGhpcyBpcyBzcGVjaWZpYyB0byBjaGF0IEFDUyBhbmQgd2lsbCBvbmx5IGJlIHVzZWQgaW5zaWRlIG13ZWJcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBHRU5FU1lTX1JFUVVFU1RfRkVUQ0hfU0VTU0lPTiA9ICdHRU5FU1lTX1JFUVVFU1RfRkVUQ0hfU0VTU0lPTidcbmV4cG9ydCBjb25zdCBHRU5FU1lTX1JFUVVFU1RfRkVUQ0hfU0VTU0lPTl9TVUNDRVNTID0gJ0dFTkVTWVNfUkVRVUVTVF9GRVRDSF9TRVNTSU9OX1NVQ0NFU1MnXG5leHBvcnQgY29uc3QgR0VORVNZU19SRVFVRVNUX0ZFVENIX1NFU1NJT05fRkFJTFVSRSA9ICdHRU5FU1lTX1JFUVVFU1RfRkVUQ0hfU0VTU0lPTl9GQUlMVVJFJ1xuZXhwb3J0IGNvbnN0IEdFTkVTWVNfVVBEQVRFX0NIQVRfREFUQV9FTkRQT0lOVCA9ICcxL3NlcnZpY2UvVXBkYXRlQ2hhdERhdGEnO1xuZXhwb3J0IGNvbnN0IEdFTkVTWVNfRkVUQ0hfU0VTU0lPTl9FTkRQT0lOVCA9ICcxL3NlcnZpY2UvR2V0UmVmSURJbmZvLyc7XG5leHBvcnQgY29uc3QgU0lURV9JTkZPX0FWQUlMQUJMRSA9ICdTSVRFX0lORk9fQVZBSUxBQkxFJztcbmV4cG9ydCBjb25zdCBURUFMSVVNX1JFQURZX0ZPUl9QVUJTVUIgPSAnVEVBTElVTV9SRUFEWV9GT1JfUFVCU1VCJztcblxuLyoqXG4gKiBnZW5lc3lzIG5hdGl2ZSBjaGF0IGV2ZW50XG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgR0VORVNZU19SRVFVRVNUX05BVElWRV9DSEFUID0gJ0dFTkVTWVNfUkVRVUVTVF9OQVRJVkVfQ0hBVCc7XG5cbmV4cG9ydCBjb25zdCBHRU5FU1lTX1ZBTElEQVRFX0lQX0FERFJFU1NfU1VDQ0VTUyA9ICdHRU5FU1lTX1ZBTElEQVRFX0lQX0FERFJFU1NfU1VDQ0VTUyc7XG5leHBvcnQgY29uc3QgR0VORVNZU19TRVRfQUdFTlRfSUQgPSAnR0VORVNZU19TRVRfQUdFTlRfSUQnO1xuXG4vKipcbiAqIGdlbmVzeXMgcmVxdWVzdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyB1cGRhdGUgZXZlbnRcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBHRU5FU1lTX1JFUVVFU1RfVENfVVBEQVRFID0gJ0dFTkVTWVNfUkVRVUVTVF9UQ19VUERBVEUnO1xuZXhwb3J0IGNvbnN0IEdFTkVTWVNfUkVRVUVTVF9UQ19VUERBVEVfU1VDQ0VTUyA9ICdHRU5FU1lTX1JFUVVFU1RfVENfVVBEQVRFX1NVQ0NFU1MnO1xuZXhwb3J0IGNvbnN0IEdFTkVTWVNfUkVRVUVTVF9UQ19VUERBVEVfRkFJTFVSRSA9ICdHRU5FU1lTX1JFUVVFU1RfVENfVVBEQVRFX0ZBSUxVUkUnO1xuXG5leHBvcnQgY29uc3QgY2hhdFNpdGVQYXJhbXMgPSB7XG4gIHNwYVBhcmFtczogdW5kZWZpbmVkXG59O1xuXG4vKipcbiAqIFBpeGVsIFRhZyBVUkwgZm9yIEVycm9yIExvZ2dpbmdcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBQSVhFTF9UQUdfVVJMID0gJ2h0dHBzOi8vd3d3LmJhbmtvZmFtZXJpY2EuY29tL3BhL2dsb2JhbC1hc3NldHMvMS4wL2dyYXBoaWMvY2xyLmdpZic7XG5cbi8qKlxuICogTW9iaWxlIEFDUyBMb2dnZXIgU2VydmljZVxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IEFDU19MT0dHRVJfVVJMID0gJy9tZ2F0ZXdheS92MS9jbGllbnRMb2dnZXIvbG9nJztcbmV4cG9ydCBjb25zdCBBQ1NfTE9HR0VSX1BVQkxJQ19VUkwgPSAnL21nYXRld2F5L3B1YmxpYy92MS9jbGllbnRMb2dnZXIvbG9nJztcblxuXG4vKipcbiAqIEluaXQgQ2hhdCBDb25zdGFudFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IElOSVRfQ0hBVCA9ICdJTklUX0NIQVQnO1xuXG4vKipcbiAqIFN1c3BlbmQgSGVhcnRiZWF0IENvbnN0YW50XG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgR0VORVNZU19TVVNQRU5EX01PTklUT1JJTkcgPSAnR0VORVNZU19TVVNQRU5EX01PTklUT1JJTkcnO1xuXG4vKipcbiAqIFJlbGVhc2UgYW5kIEVudmlyb25tZW50YWwgQ29uc3RhbnRzXG4gKiBAdHlwZSB7YXJyYXl9XG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgTUVSUklMTCA9ICdNRVJSSUxMJztcbmV4cG9ydCBjb25zdCBJTlRFUk5BTCA9ICdJTlRFUk5BTCc7XG5leHBvcnQgY29uc3QgQk9GQSA9ICdCT0ZBJztcbmV4cG9ydCBjb25zdCBTUEFSVEEgPSAnU1BBUlRBJztcbmV4cG9ydCBjb25zdCBCT0ZBX0RPTUFJTlMgPSBbXG4gICdkZXYxLicsXG4gICdkZXYyLiwnLFxuICAnZGV2My4nLFxuICAnZGV2NC4nLFxuICAnZGV2ZmxleC4nLFxuICAnZGV2cHMuJyxcbiAgJ3FhNS4nLFxuICAncWFwcy4nLFxuICAnY2VydDEuJyxcbiAgJ2NlcnQyLicsXG4gICdwdDEuJyxcbiAgJ3B0Mi4nLFxuICAncHJldmlldzEuJyxcbiAgJ3ByZXZpZXcyLicsXG4gICdyZXZpZXcxLicsXG4gICdyZXZpZXcyLicsXG4gICdkZXYxLWhlbGl4LicsXG4gICdkZXYyLWhlbGl4LicsXG4gICdkZXYzLWhlbGl4LicsXG4gICdkZXY0LWhlbGl4LicsXG4gICdkZXZmbGV4MS1oZWxpeC4nLFxuICAncHQxLWhlbGl4LicsXG4gICdwdDItaGVsaXguJyxcbiAgJ3Bzc2l0LWhlbGl4LicsXG4gICdwcmV2aWV3MS1oZWxpeC4nLFxuICAncHJldmlldzItaGVsaXguJyxcbiAgJ3JldmlldzEtaGVsaXguJyxcbiAgJ3JldmlldzItaGVsaXguJyxcbiAgJ3NpdDFhLWhlbGl4LicsXG4gICdzaXQyYS1oZWxpeC4nLFxuICAnc2l0My1oZWxpeC4nLFxuICAnc2l0YmMtaGVsaXguJyxcbl07XG5leHBvcnQgY29uc3QgSVJfRU5WID0ge1xuICBERVY6ICdkZXY0JyxcbiAgQ0VSVDogJ3NpdDFhJyxcbn07XG5cbi8qKlxuICogU2FsZSBJbmRpY2F0b3JzIENvbnN0YW50cyBBcnJheVxuICogQHR5cGUge2FycmF5fVxuICovXG5leHBvcnQgY29uc3QgTUxfU0FMRV9JTkRJQ0FUT1JTID0gW1xuICAnaW5xQ2xpZW50T3JkZXJOdW0nLFxuICAnTUxEX09BT19DT05GSVJNQVRJT05OVU1CRVInLFxuICAnTUxEX09BT19BQ0NPVU5UTlVNQkVSJyxcbl07XG5leHBvcnQgY29uc3QgQk9GQV9TQUxFX0lORElDQVRPUlMgPSBbXG4gICdhcHBsaWNhdGlvbklEJyxcbl07XG5leHBvcnQgY29uc3QgSU5RX0NMSUVOVF9PUkRFUl9OVU0gPSAnaW5xQ2xpZW50T3JkZXJOdW0nO1xuZXhwb3J0IGNvbnN0IENPT0tJRSA9IHtcbiAgTkFNRTogJ29jY3RDaGF0JyxcbiAgRVhQSVJBVElPTjogMTAsXG4gIERPTUFJTjogJy5iYW5rb2ZhbWVyaWNhLmNvbScsXG4gIFNFQ1VSRTogdHJ1ZSxcbiAgUEFUSDogJy8nLFxufTtcblxuLyoqXG4gKiBHU0lEIENvb2tpZVxuICovXG5leHBvcnQgY29uc3QgQ09PS0lFX0dTSUQgPSB7XG4gIE5BTUU6ICdHU0lEJyxcbiAgRE9NQUlOOiAnLmJhbmtvZmFtZXJpY2EuY29tJyxcbiAgU0VDVVJFOiB0cnVlLFxuICBQQVRIOiAnLycsXG59OyIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvdHlwZS1idWlsdGlucyAqL1xudmFyIGcgPVxuICAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbFRoaXMpIHx8XG4gICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZikgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWwpIHx8XG4gIHt9XG5cbnZhciBzdXBwb3J0ID0ge1xuICBzZWFyY2hQYXJhbXM6ICdVUkxTZWFyY2hQYXJhbXMnIGluIGcsXG4gIGl0ZXJhYmxlOiAnU3ltYm9sJyBpbiBnICYmICdpdGVyYXRvcicgaW4gU3ltYm9sLFxuICBibG9iOlxuICAgICdGaWxlUmVhZGVyJyBpbiBnICYmXG4gICAgJ0Jsb2InIGluIGcgJiZcbiAgICAoZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgQmxvYigpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH0pKCksXG4gIGZvcm1EYXRhOiAnRm9ybURhdGEnIGluIGcsXG4gIGFycmF5QnVmZmVyOiAnQXJyYXlCdWZmZXInIGluIGdcbn1cblxuZnVuY3Rpb24gaXNEYXRhVmlldyhvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBEYXRhVmlldy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvYmopXG59XG5cbmlmIChzdXBwb3J0LmFycmF5QnVmZmVyKSB7XG4gIHZhciB2aWV3Q2xhc3NlcyA9IFtcbiAgICAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBGbG9hdDY0QXJyYXldJ1xuICBdXG5cbiAgdmFyIGlzQXJyYXlCdWZmZXJWaWV3ID1cbiAgICBBcnJheUJ1ZmZlci5pc1ZpZXcgfHxcbiAgICBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdmlld0NsYXNzZXMuaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSkgPiAtMVxuICAgIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmFtZShuYW1lKSB7XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICBuYW1lID0gU3RyaW5nKG5hbWUpXG4gIH1cbiAgaWYgKC9bXmEtejAtOVxcLSMkJSYnKisuXl9gfH4hXS9pLnRlc3QobmFtZSkgfHwgbmFtZSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGNoYXJhY3RlciBpbiBoZWFkZXIgZmllbGQgbmFtZTogXCInICsgbmFtZSArICdcIicpXG4gIH1cbiAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgIHZhbHVlID0gU3RyaW5nKHZhbHVlKVxuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG4vLyBCdWlsZCBhIGRlc3RydWN0aXZlIGl0ZXJhdG9yIGZvciB0aGUgdmFsdWUgbGlzdFxuZnVuY3Rpb24gaXRlcmF0b3JGb3IoaXRlbXMpIHtcbiAgdmFyIGl0ZXJhdG9yID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHZhbHVlID0gaXRlbXMuc2hpZnQoKVxuICAgICAgcmV0dXJuIHtkb25lOiB2YWx1ZSA9PT0gdW5kZWZpbmVkLCB2YWx1ZTogdmFsdWV9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuaXRlcmFibGUpIHtcbiAgICBpdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gaXRlcmF0b3JcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXRlcmF0b3Jcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEhlYWRlcnMoaGVhZGVycykge1xuICB0aGlzLm1hcCA9IHt9XG5cbiAgaWYgKGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICB0aGlzLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICB9LCB0aGlzKVxuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVycykpIHtcbiAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24oaGVhZGVyKSB7XG4gICAgICBpZiAoaGVhZGVyLmxlbmd0aCAhPSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0hlYWRlcnMgY29uc3RydWN0b3I6IGV4cGVjdGVkIG5hbWUvdmFsdWUgcGFpciB0byBiZSBsZW5ndGggMiwgZm91bmQnICsgaGVhZGVyLmxlbmd0aClcbiAgICAgIH1cbiAgICAgIHRoaXMuYXBwZW5kKGhlYWRlclswXSwgaGVhZGVyWzFdKVxuICAgIH0sIHRoaXMpXG4gIH0gZWxzZSBpZiAoaGVhZGVycykge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgdGhpcy5hcHBlbmQobmFtZSwgaGVhZGVyc1tuYW1lXSlcbiAgICB9LCB0aGlzKVxuICB9XG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIG5hbWUgPSBub3JtYWxpemVOYW1lKG5hbWUpXG4gIHZhbHVlID0gbm9ybWFsaXplVmFsdWUodmFsdWUpXG4gIHZhciBvbGRWYWx1ZSA9IHRoaXMubWFwW25hbWVdXG4gIHRoaXMubWFwW25hbWVdID0gb2xkVmFsdWUgPyBvbGRWYWx1ZSArICcsICcgKyB2YWx1ZSA6IHZhbHVlXG59XG5cbkhlYWRlcnMucHJvdG90eXBlWydkZWxldGUnXSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgZGVsZXRlIHRoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSlcbiAgcmV0dXJuIHRoaXMuaGFzKG5hbWUpID8gdGhpcy5tYXBbbmFtZV0gOiBudWxsXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMubWFwLmhhc093blByb3BlcnR5KG5vcm1hbGl6ZU5hbWUobmFtZSkpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHRoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldID0gbm9ybWFsaXplVmFsdWUodmFsdWUpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaywgdGhpc0FyZykge1xuICBmb3IgKHZhciBuYW1lIGluIHRoaXMubWFwKSB7XG4gICAgaWYgKHRoaXMubWFwLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHRoaXMubWFwW25hbWVdLCBuYW1lLCB0aGlzKVxuICAgIH1cbiAgfVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IFtdXG4gIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgIGl0ZW1zLnB1c2gobmFtZSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGl0ZW1zID0gW11cbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaXRlbXMucHVzaCh2YWx1ZSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IFtdXG4gIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgIGl0ZW1zLnB1c2goW25hbWUsIHZhbHVlXSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5pZiAoc3VwcG9ydC5pdGVyYWJsZSkge1xuICBIZWFkZXJzLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gSGVhZGVycy5wcm90b3R5cGUuZW50cmllc1xufVxuXG5mdW5jdGlvbiBjb25zdW1lZChib2R5KSB7XG4gIGlmIChib2R5Ll9ub0JvZHkpIHJldHVyblxuICBpZiAoYm9keS5ib2R5VXNlZCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKCdBbHJlYWR5IHJlYWQnKSlcbiAgfVxuICBib2R5LmJvZHlVc2VkID0gdHJ1ZVxufVxuXG5mdW5jdGlvbiBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXNvbHZlKHJlYWRlci5yZXN1bHQpXG4gICAgfVxuICAgIHJlYWRlci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZWplY3QocmVhZGVyLmVycm9yKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2JBc0FycmF5QnVmZmVyKGJsb2IpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKClcbiAgdmFyIHByb21pc2UgPSBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKVxuICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYilcbiAgcmV0dXJuIHByb21pc2Vcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2JBc1RleHQoYmxvYikge1xuICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICB2YXIgcHJvbWlzZSA9IGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpXG4gIHZhciBtYXRjaCA9IC9jaGFyc2V0PShbQS1aYS16MC05Xy1dKykvLmV4ZWMoYmxvYi50eXBlKVxuICB2YXIgZW5jb2RpbmcgPSBtYXRjaCA/IG1hdGNoWzFdIDogJ3V0Zi04J1xuICByZWFkZXIucmVhZEFzVGV4dChibG9iLCBlbmNvZGluZylcbiAgcmV0dXJuIHByb21pc2Vcbn1cblxuZnVuY3Rpb24gcmVhZEFycmF5QnVmZmVyQXNUZXh0KGJ1Zikge1xuICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZilcbiAgdmFyIGNoYXJzID0gbmV3IEFycmF5KHZpZXcubGVuZ3RoKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykge1xuICAgIGNoYXJzW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZSh2aWV3W2ldKVxuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBidWZmZXJDbG9uZShidWYpIHtcbiAgaWYgKGJ1Zi5zbGljZSkge1xuICAgIHJldHVybiBidWYuc2xpY2UoMClcbiAgfSBlbHNlIHtcbiAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zi5ieXRlTGVuZ3RoKVxuICAgIHZpZXcuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZikpXG4gICAgcmV0dXJuIHZpZXcuYnVmZmVyXG4gIH1cbn1cblxuZnVuY3Rpb24gQm9keSgpIHtcbiAgdGhpcy5ib2R5VXNlZCA9IGZhbHNlXG5cbiAgdGhpcy5faW5pdEJvZHkgPSBmdW5jdGlvbihib2R5KSB7XG4gICAgLypcbiAgICAgIGZldGNoLW1vY2sgd3JhcHMgdGhlIFJlc3BvbnNlIG9iamVjdCBpbiBhbiBFUzYgUHJveHkgdG9cbiAgICAgIHByb3ZpZGUgdXNlZnVsIHRlc3QgaGFybmVzcyBmZWF0dXJlcyBzdWNoIGFzIGZsdXNoLiBIb3dldmVyLCBvblxuICAgICAgRVM1IGJyb3dzZXJzIHdpdGhvdXQgZmV0Y2ggb3IgUHJveHkgc3VwcG9ydCBwb2xseWZpbGxzIG11c3QgYmUgdXNlZDtcbiAgICAgIHRoZSBwcm94eS1wb2xseWZpbGwgaXMgdW5hYmxlIHRvIHByb3h5IGFuIGF0dHJpYnV0ZSB1bmxlc3MgaXQgZXhpc3RzXG4gICAgICBvbiB0aGUgb2JqZWN0IGJlZm9yZSB0aGUgUHJveHkgaXMgY3JlYXRlZC4gVGhpcyBjaGFuZ2UgZW5zdXJlc1xuICAgICAgUmVzcG9uc2UuYm9keVVzZWQgZXhpc3RzIG9uIHRoZSBpbnN0YW5jZSwgd2hpbGUgbWFpbnRhaW5pbmcgdGhlXG4gICAgICBzZW1hbnRpYyBvZiBzZXR0aW5nIFJlcXVlc3QuYm9keVVzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGJlZm9yZVxuICAgICAgX2luaXRCb2R5IGlzIGNhbGxlZC5cbiAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWFzc2lnblxuICAgIHRoaXMuYm9keVVzZWQgPSB0aGlzLmJvZHlVc2VkXG4gICAgdGhpcy5fYm9keUluaXQgPSBib2R5XG4gICAgaWYgKCFib2R5KSB7XG4gICAgICB0aGlzLl9ub0JvZHkgPSB0cnVlO1xuICAgICAgdGhpcy5fYm9keVRleHQgPSAnJ1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYmxvYiAmJiBCbG9iLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICB0aGlzLl9ib2R5QmxvYiA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuZm9ybURhdGEgJiYgRm9ybURhdGEucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlGb3JtRGF0YSA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuc2VhcmNoUGFyYW1zICYmIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5LnRvU3RyaW5nKClcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIgJiYgc3VwcG9ydC5ibG9iICYmIGlzRGF0YVZpZXcoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkuYnVmZmVyKVxuICAgICAgLy8gSUUgMTAtMTEgY2FuJ3QgaGFuZGxlIGEgRGF0YVZpZXcgYm9keS5cbiAgICAgIHRoaXMuX2JvZHlJbml0ID0gbmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pXG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyICYmIChBcnJheUJ1ZmZlci5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSB8fCBpc0FycmF5QnVmZmVyVmlldyhib2R5KSkpIHtcbiAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChib2R5KVxuICAgIH1cblxuICAgIGlmICghdGhpcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpIHtcbiAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ3RleHQvcGxhaW47Y2hhcnNldD1VVEYtOCcpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlCbG9iICYmIHRoaXMuX2JvZHlCbG9iLnR5cGUpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgdGhpcy5fYm9keUJsb2IudHlwZSlcbiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5zZWFyY2hQYXJhbXMgJiYgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCcpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuYmxvYikge1xuICAgIHRoaXMuYmxvYiA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0ZWRcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2JvZHlCbG9iKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUJsb2IpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKSlcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyBibG9iJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlUZXh0XSkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGhpcy5hcnJheUJ1ZmZlciA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgIHZhciBpc0NvbnN1bWVkID0gY29uc3VtZWQodGhpcylcbiAgICAgIGlmIChpc0NvbnN1bWVkKSB7XG4gICAgICAgIHJldHVybiBpc0NvbnN1bWVkXG4gICAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ1ZmZlci5zbGljZShcbiAgICAgICAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ5dGVPZmZzZXQgKyB0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmJsb2IpIHtcbiAgICAgIHJldHVybiB0aGlzLmJsb2IoKS50aGVuKHJlYWRCbG9iQXNBcnJheUJ1ZmZlcilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBhcyBBcnJheUJ1ZmZlcicpXG4gICAgfVxuICB9XG5cbiAgdGhpcy50ZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICBpZiAocmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiByZWplY3RlZFxuICAgIH1cblxuICAgIGlmICh0aGlzLl9ib2R5QmxvYikge1xuICAgICAgcmV0dXJuIHJlYWRCbG9iQXNUZXh0KHRoaXMuX2JvZHlCbG9iKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlYWRBcnJheUJ1ZmZlckFzVGV4dCh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgdGV4dCcpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keVRleHQpXG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuZm9ybURhdGEpIHtcbiAgICB0aGlzLmZvcm1EYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihkZWNvZGUpXG4gICAgfVxuICB9XG5cbiAgdGhpcy5qc29uID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oSlNPTi5wYXJzZSlcbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhUVFAgbWV0aG9kcyB3aG9zZSBjYXBpdGFsaXphdGlvbiBzaG91bGQgYmUgbm9ybWFsaXplZFxudmFyIG1ldGhvZHMgPSBbJ0NPTk5FQ1QnLCAnREVMRVRFJywgJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnLCAnUEFUQ0gnLCAnUE9TVCcsICdQVVQnLCAnVFJBQ0UnXVxuXG5mdW5jdGlvbiBub3JtYWxpemVNZXRob2QobWV0aG9kKSB7XG4gIHZhciB1cGNhc2VkID0gbWV0aG9kLnRvVXBwZXJDYXNlKClcbiAgcmV0dXJuIG1ldGhvZHMuaW5kZXhPZih1cGNhc2VkKSA+IC0xID8gdXBjYXNlZCA6IG1ldGhvZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gUmVxdWVzdChpbnB1dCwgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVxdWVzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQbGVhc2UgdXNlIHRoZSBcIm5ld1wiIG9wZXJhdG9yLCB0aGlzIERPTSBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLicpXG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keVxuXG4gIGlmIChpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICBpZiAoaW5wdXQuYm9keVVzZWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpXG4gICAgfVxuICAgIHRoaXMudXJsID0gaW5wdXQudXJsXG4gICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzXG4gICAgaWYgKCFvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKGlucHV0LmhlYWRlcnMpXG4gICAgfVxuICAgIHRoaXMubWV0aG9kID0gaW5wdXQubWV0aG9kXG4gICAgdGhpcy5tb2RlID0gaW5wdXQubW9kZVxuICAgIHRoaXMuc2lnbmFsID0gaW5wdXQuc2lnbmFsXG4gICAgaWYgKCFib2R5ICYmIGlucHV0Ll9ib2R5SW5pdCAhPSBudWxsKSB7XG4gICAgICBib2R5ID0gaW5wdXQuX2JvZHlJbml0XG4gICAgICBpbnB1dC5ib2R5VXNlZCA9IHRydWVcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy51cmwgPSBTdHJpbmcoaW5wdXQpXG4gIH1cblxuICB0aGlzLmNyZWRlbnRpYWxzID0gb3B0aW9ucy5jcmVkZW50aWFscyB8fCB0aGlzLmNyZWRlbnRpYWxzIHx8ICdzYW1lLW9yaWdpbidcbiAgaWYgKG9wdGlvbnMuaGVhZGVycyB8fCAhdGhpcy5oZWFkZXJzKSB7XG4gICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKVxuICB9XG4gIHRoaXMubWV0aG9kID0gbm9ybWFsaXplTWV0aG9kKG9wdGlvbnMubWV0aG9kIHx8IHRoaXMubWV0aG9kIHx8ICdHRVQnKVxuICB0aGlzLm1vZGUgPSBvcHRpb25zLm1vZGUgfHwgdGhpcy5tb2RlIHx8IG51bGxcbiAgdGhpcy5zaWduYWwgPSBvcHRpb25zLnNpZ25hbCB8fCB0aGlzLnNpZ25hbCB8fCAoZnVuY3Rpb24gKCkge1xuICAgIGlmICgnQWJvcnRDb250cm9sbGVyJyBpbiBnKSB7XG4gICAgICB2YXIgY3RybCA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHJldHVybiBjdHJsLnNpZ25hbDtcbiAgICB9XG4gIH0oKSk7XG4gIHRoaXMucmVmZXJyZXIgPSBudWxsXG5cbiAgaWYgKCh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykgJiYgYm9keSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzJylcbiAgfVxuICB0aGlzLl9pbml0Qm9keShib2R5KVxuXG4gIGlmICh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykge1xuICAgIGlmIChvcHRpb25zLmNhY2hlID09PSAnbm8tc3RvcmUnIHx8IG9wdGlvbnMuY2FjaGUgPT09ICduby1jYWNoZScpIHtcbiAgICAgIC8vIFNlYXJjaCBmb3IgYSAnXycgcGFyYW1ldGVyIGluIHRoZSBxdWVyeSBzdHJpbmdcbiAgICAgIHZhciByZVBhcmFtU2VhcmNoID0gLyhbPyZdKV89W14mXSovXG4gICAgICBpZiAocmVQYXJhbVNlYXJjaC50ZXN0KHRoaXMudXJsKSkge1xuICAgICAgICAvLyBJZiBpdCBhbHJlYWR5IGV4aXN0cyB0aGVuIHNldCB0aGUgdmFsdWUgd2l0aCB0aGUgY3VycmVudCB0aW1lXG4gICAgICAgIHRoaXMudXJsID0gdGhpcy51cmwucmVwbGFjZShyZVBhcmFtU2VhcmNoLCAnJDFfPScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSBhZGQgYSBuZXcgJ18nIHBhcmFtZXRlciB0byB0aGUgZW5kIHdpdGggdGhlIGN1cnJlbnQgdGltZVxuICAgICAgICB2YXIgcmVRdWVyeVN0cmluZyA9IC9cXD8vXG4gICAgICAgIHRoaXMudXJsICs9IChyZVF1ZXJ5U3RyaW5nLnRlc3QodGhpcy51cmwpID8gJyYnIDogJz8nKSArICdfPScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFJlcXVlc3QodGhpcywge2JvZHk6IHRoaXMuX2JvZHlJbml0fSlcbn1cblxuZnVuY3Rpb24gZGVjb2RlKGJvZHkpIHtcbiAgdmFyIGZvcm0gPSBuZXcgRm9ybURhdGEoKVxuICBib2R5XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgnJicpXG4gICAgLmZvckVhY2goZnVuY3Rpb24oYnl0ZXMpIHtcbiAgICAgIGlmIChieXRlcykge1xuICAgICAgICB2YXIgc3BsaXQgPSBieXRlcy5zcGxpdCgnPScpXG4gICAgICAgIHZhciBuYW1lID0gc3BsaXQuc2hpZnQoKS5yZXBsYWNlKC9cXCsvZywgJyAnKVxuICAgICAgICB2YXIgdmFsdWUgPSBzcGxpdC5qb2luKCc9JykucmVwbGFjZSgvXFwrL2csICcgJylcbiAgICAgICAgZm9ybS5hcHBlbmQoZGVjb2RlVVJJQ29tcG9uZW50KG5hbWUpLCBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpKVxuICAgICAgfVxuICAgIH0pXG4gIHJldHVybiBmb3JtXG59XG5cbmZ1bmN0aW9uIHBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKSB7XG4gIHZhciBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKVxuICAvLyBSZXBsYWNlIGluc3RhbmNlcyBvZiBcXHJcXG4gYW5kIFxcbiBmb2xsb3dlZCBieSBhdCBsZWFzdCBvbmUgc3BhY2Ugb3IgaG9yaXpvbnRhbCB0YWIgd2l0aCBhIHNwYWNlXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4yXG4gIHZhciBwcmVQcm9jZXNzZWRIZWFkZXJzID0gcmF3SGVhZGVycy5yZXBsYWNlKC9cXHI/XFxuW1xcdCBdKy9nLCAnICcpXG4gIC8vIEF2b2lkaW5nIHNwbGl0IHZpYSByZWdleCB0byB3b3JrIGFyb3VuZCBhIGNvbW1vbiBJRTExIGJ1ZyB3aXRoIHRoZSBjb3JlLWpzIDMuNi4wIHJlZ2V4IHBvbHlmaWxsXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWIvZmV0Y2gvaXNzdWVzLzc0OFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNzUxXG4gIHByZVByb2Nlc3NlZEhlYWRlcnNcbiAgICAuc3BsaXQoJ1xccicpXG4gICAgLm1hcChmdW5jdGlvbihoZWFkZXIpIHtcbiAgICAgIHJldHVybiBoZWFkZXIuaW5kZXhPZignXFxuJykgPT09IDAgPyBoZWFkZXIuc3Vic3RyKDEsIGhlYWRlci5sZW5ndGgpIDogaGVhZGVyXG4gICAgfSlcbiAgICAuZm9yRWFjaChmdW5jdGlvbihsaW5lKSB7XG4gICAgICB2YXIgcGFydHMgPSBsaW5lLnNwbGl0KCc6JylcbiAgICAgIHZhciBrZXkgPSBwYXJ0cy5zaGlmdCgpLnRyaW0oKVxuICAgICAgaWYgKGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5qb2luKCc6JykudHJpbSgpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaGVhZGVycy5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1Jlc3BvbnNlICcgKyBlcnJvci5tZXNzYWdlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgcmV0dXJuIGhlYWRlcnNcbn1cblxuQm9keS5jYWxsKFJlcXVlc3QucHJvdG90eXBlKVxuXG5leHBvcnQgZnVuY3Rpb24gUmVzcG9uc2UoYm9keUluaXQsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlc3BvbnNlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BsZWFzZSB1c2UgdGhlIFwibmV3XCIgb3BlcmF0b3IsIHRoaXMgRE9NIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uJylcbiAgfVxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge31cbiAgfVxuXG4gIHRoaXMudHlwZSA9ICdkZWZhdWx0J1xuICB0aGlzLnN0YXR1cyA9IG9wdGlvbnMuc3RhdHVzID09PSB1bmRlZmluZWQgPyAyMDAgOiBvcHRpb25zLnN0YXR1c1xuICBpZiAodGhpcy5zdGF0dXMgPCAyMDAgfHwgdGhpcy5zdGF0dXMgPiA1OTkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Jlc3BvbnNlJzogVGhlIHN0YXR1cyBwcm92aWRlZCAoMCkgaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzIwMCwgNTk5XS5cIilcbiAgfVxuICB0aGlzLm9rID0gdGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgMzAwXG4gIHRoaXMuc3RhdHVzVGV4dCA9IG9wdGlvbnMuc3RhdHVzVGV4dCA9PT0gdW5kZWZpbmVkID8gJycgOiAnJyArIG9wdGlvbnMuc3RhdHVzVGV4dFxuICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpXG4gIHRoaXMudXJsID0gb3B0aW9ucy51cmwgfHwgJydcbiAgdGhpcy5faW5pdEJvZHkoYm9keUluaXQpXG59XG5cbkJvZHkuY2FsbChSZXNwb25zZS5wcm90b3R5cGUpXG5cblJlc3BvbnNlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuX2JvZHlJbml0LCB7XG4gICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICBzdGF0dXNUZXh0OiB0aGlzLnN0YXR1c1RleHQsXG4gICAgaGVhZGVyczogbmV3IEhlYWRlcnModGhpcy5oZWFkZXJzKSxcbiAgICB1cmw6IHRoaXMudXJsXG4gIH0pXG59XG5cblJlc3BvbnNlLmVycm9yID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZXNwb25zZSA9IG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiAyMDAsIHN0YXR1c1RleHQ6ICcnfSlcbiAgcmVzcG9uc2Uub2sgPSBmYWxzZVxuICByZXNwb25zZS5zdGF0dXMgPSAwXG4gIHJlc3BvbnNlLnR5cGUgPSAnZXJyb3InXG4gIHJldHVybiByZXNwb25zZVxufVxuXG52YXIgcmVkaXJlY3RTdGF0dXNlcyA9IFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF1cblxuUmVzcG9uc2UucmVkaXJlY3QgPSBmdW5jdGlvbih1cmwsIHN0YXR1cykge1xuICBpZiAocmVkaXJlY3RTdGF0dXNlcy5pbmRleE9mKHN0YXR1cykgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgc3RhdHVzIGNvZGUnKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IHtsb2NhdGlvbjogdXJsfX0pXG59XG5cbmV4cG9ydCB2YXIgRE9NRXhjZXB0aW9uID0gZy5ET01FeGNlcHRpb25cbnRyeSB7XG4gIG5ldyBET01FeGNlcHRpb24oKVxufSBjYXRjaCAoZXJyKSB7XG4gIERPTUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UsIG5hbWUpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlXG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHZhciBlcnJvciA9IEVycm9yKG1lc3NhZ2UpXG4gICAgdGhpcy5zdGFjayA9IGVycm9yLnN0YWNrXG4gIH1cbiAgRE9NRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKVxuICBET01FeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRE9NRXhjZXB0aW9uXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaChpbnB1dCwgaW5pdCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgaW5pdClcblxuICAgIGlmIChyZXF1ZXN0LnNpZ25hbCAmJiByZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICByZXR1cm4gcmVqZWN0KG5ldyBET01FeGNlcHRpb24oJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpKVxuICAgIH1cblxuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuXG4gICAgZnVuY3Rpb24gYWJvcnRYaHIoKSB7XG4gICAgICB4aHIuYWJvcnQoKVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBzdGF0dXNUZXh0OiB4aHIuc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogcGFyc2VIZWFkZXJzKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSB8fCAnJylcbiAgICAgIH1cbiAgICAgIC8vIFRoaXMgY2hlY2sgaWYgc3BlY2lmaWNhbGx5IGZvciB3aGVuIGEgdXNlciBmZXRjaGVzIGEgZmlsZSBsb2NhbGx5IGZyb20gdGhlIGZpbGUgc3lzdGVtXG4gICAgICAvLyBPbmx5IGlmIHRoZSBzdGF0dXMgaXMgb3V0IG9mIGEgbm9ybWFsIHJhbmdlXG4gICAgICBpZiAocmVxdWVzdC51cmwuaW5kZXhPZignZmlsZTovLycpID09PSAwICYmICh4aHIuc3RhdHVzIDwgMjAwIHx8IHhoci5zdGF0dXMgPiA1OTkpKSB7XG4gICAgICAgIG9wdGlvbnMuc3RhdHVzID0gMjAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucy5zdGF0dXMgPSB4aHIuc3RhdHVzO1xuICAgICAgfVxuICAgICAgb3B0aW9ucy51cmwgPSAncmVzcG9uc2VVUkwnIGluIHhociA/IHhoci5yZXNwb25zZVVSTCA6IG9wdGlvbnMuaGVhZGVycy5nZXQoJ1gtUmVxdWVzdC1VUkwnKVxuICAgICAgdmFyIGJvZHkgPSAncmVzcG9uc2UnIGluIHhociA/IHhoci5yZXNwb25zZSA6IHhoci5yZXNwb25zZVRleHRcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKGJvZHksIG9wdGlvbnMpKVxuICAgICAgfSwgMClcbiAgICB9XG5cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQnKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCB0aW1lZCBvdXQnKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChuZXcgRE9NRXhjZXB0aW9uKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZml4VXJsKHVybCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVybCA9PT0gJycgJiYgZy5sb2NhdGlvbi5ocmVmID8gZy5sb2NhdGlvbi5ocmVmIDogdXJsXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB1cmxcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub3BlbihyZXF1ZXN0Lm1ldGhvZCwgZml4VXJsKHJlcXVlc3QudXJsKSwgdHJ1ZSlcblxuICAgIGlmIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnaW5jbHVkZScpIHtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnb21pdCcpIHtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmICgncmVzcG9uc2VUeXBlJyBpbiB4aHIpIHtcbiAgICAgIGlmIChzdXBwb3J0LmJsb2IpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdibG9iJ1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgc3VwcG9ydC5hcnJheUJ1ZmZlclxuICAgICAgKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGluaXQgJiYgdHlwZW9mIGluaXQuaGVhZGVycyA9PT0gJ29iamVjdCcgJiYgIShpbml0LmhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzIHx8IChnLkhlYWRlcnMgJiYgaW5pdC5oZWFkZXJzIGluc3RhbmNlb2YgZy5IZWFkZXJzKSkpIHtcbiAgICAgIHZhciBuYW1lcyA9IFtdO1xuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaW5pdC5oZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgbmFtZXMucHVzaChub3JtYWxpemVOYW1lKG5hbWUpKVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCBub3JtYWxpemVWYWx1ZShpbml0LmhlYWRlcnNbbmFtZV0pKVxuICAgICAgfSlcbiAgICAgIHJlcXVlc3QuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGlmIChuYW1lcy5pbmRleE9mKG5hbWUpID09PSAtMSkge1xuICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXF1ZXN0LmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCB2YWx1ZSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3Quc2lnbmFsKSB7XG4gICAgICByZXF1ZXN0LnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0WGhyKVxuXG4gICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIERPTkUgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSlcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgcmVxdWVzdC5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydFhocilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5zZW5kKHR5cGVvZiByZXF1ZXN0Ll9ib2R5SW5pdCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogcmVxdWVzdC5fYm9keUluaXQpXG4gIH0pXG59XG5cbmZldGNoLnBvbHlmaWxsID0gdHJ1ZVxuXG5pZiAoIWcuZmV0Y2gpIHtcbiAgZy5mZXRjaCA9IGZldGNoXG4gIGcuSGVhZGVycyA9IEhlYWRlcnNcbiAgZy5SZXF1ZXN0ID0gUmVxdWVzdFxuICBnLlJlc3BvbnNlID0gUmVzcG9uc2Vcbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBkZWZpbml0aW9uKSB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqLCBwcm9wKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTsgfSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiLy9AdHMtbm9jaGVja1xuXG5pbXBvcnQgXCJ3aGF0d2ctZmV0Y2hcIjtcbmltcG9ydCBcIi4vcHVic3ViL2Jvb3RzdHJhcFwiO1xuaW1wb3J0IFwiLi9wdWJzdWIvcG9zdC1tZXNzYWdlc1wiO1xuaW1wb3J0IHBsYWNlaG9sZGVyIGZyb20gXCIuL3B1YnN1Yi9wbGFjZWhvbGRlclwiO1xuaW1wb3J0IHdpZGdldFNjcmlwdCBmcm9tIFwiLi9wdWJzdWIvd2lkZ2V0LXNjcmlwdFwiO1xuaW1wb3J0IGdlbmVzeXNEYXRhSW5pdCBmcm9tIFwiLi9zYWxlcy9nZW5lc3lzLWRhdGFcIjtcbmltcG9ydCB3aWRnZXRTY3JpcHRMb2FkZWQgZnJvbSBcIi4vcHVic3ViL3dpZGdldC1zY3JpcHQtbG9hZGVkXCI7XG5cbmltcG9ydCB7XG4gIGNoZWNrV3JhcCxcbiAgcHJveHlDaGF0RERPLFxuICBtb2NrUmVmSUQsXG4gIHFzTG9iU2V0dGVyLFxuICBpc1VuaXZlcnNhbEhlYWRlcixcbiAgaXNWNlxufSBmcm9tIFwiLi91dGlsaXRpZXMvdXRpbGl0aWVzXCI7XG5cbmltcG9ydCB7IElOSVRfQ0hBVCB9IGZyb20gXCIuL3dpZGdldC1jb25zdGFudHNcIjtcblxuLyoqXG4gKiBMb2FkIENoYXQgV2lkZ2V0XG4gKlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gbG9hZHMgY2hhdCB3aWRnZXQsIGJ1dCBhbHNvIGRvZXMgc2V2ZXJhbCBvdGhlciB0aGluZ3M6XG4gKlxuICogLSBHZW5lc3lzIERhdGEgaXMgcG9wdWxhdGVkXG4gKiAtIENoYXQgUGxhY2Vob2xkZXIgaXMgYWRkZWRcbiAqIC0gV2lkZ2V0IFNjcmlwdCAmIFBvbHlmaWxsIGFkZGVkXG4gKiAtIE1vY2sgUmVmIElEIFVzZSBDYXNlXG4gKiAtIFByb3h5IENoYXQgRERPXG4gKiAtIFNlY3VyZSBBZ2VudHNcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBsb2FkQ2hhdFdpZGdldCA9ICgpID0+IHtcbiAgZ2VuZXN5c0RhdGFJbml0KCk7XG4gIHBsYWNlaG9sZGVyKCk7XG5cbiAgLy8gSXMgVjZcbiAgY29uc3QgdjYgPSBpc1Y2KCk7XG4gIHdpZGdldFNjcmlwdCgpO1xuICBpZiAodjYpIHtcbiAgICB3aW5kb3cuc3BhcnRhLmNoYXQgPSB7fTtcbiAgICB3aW5kb3cuc3BhcnRhLmNoYXQud2lkZ2V0TG9hZGVyID0gd2luZG93LnNwYXJ0YS53aWRnZXRMb2FkZXJbXCI2LjAuOVwiXTtcbiAgICB3aW5kb3cuc3BhcnRhLmNoYXQud2lkZ2V0TG9hZGVyLnN1YiA9IChtZXNzYWdlOiBzdHJpbmcsIGZ1bmM6IEZ1bmN0aW9uKSA9PiB7IH07XG4gICAgd2luZG93LnNwYXJ0YS5jaGF0LndpZGdldExvYWRlci5wdWIgPSAobWVzc2FnZTogc3RyaW5nLCBkYXRhOiBhbnkpID0+IHsgfTtcbiAgfVxuICAvLyBub25lIG9mIHRoaXMgY29kZSBiZWluZyByYW5cbiAgd2lkZ2V0U2NyaXB0TG9hZGVkKCk7XG4gIG1vY2tSZWZJRCgpO1xuICBwcm94eUNoYXRERE8od2luZG93LmRpZ2l0YWxEYXRhLnBhZ2UuYXR0cmlidXRlcy5jaGF0LCBcInNpdGVfaWRcIik7XG5cbiAgaWYgKHR5cGVvZiBiYWN0bSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGNvbnN0IGFnZW50TFRTID0gYmFjdG0uU3RvcmUoXCJjaGF0XCIsIHsgdHlwZTogXCJjb29raWVcIiB9KTtcbiAgICBpZiAoYWdlbnRMVFMuZ2V0KFwic2VjdXJlQWdlbnRJRFwiKSkge1xuICAgICAgY29uc3QgYWdlbnRJRCA9IGFnZW50TFRTLmdldChcInNlY3VyZUFnZW50SURcIik7XG4gICAgICBkaWdpdGFsRGF0YS5wYWdlLmF0dHJpYnV0ZXMuY2hhdC5hZ2VudF9pZCA9IGFnZW50SUQ7XG4gICAgfVxuICAgIHFzTG9iU2V0dGVyKCk7XG4gICAgYmFjdG0uZGRvLnNldChcInBhZ2UuYXR0cmlidXRlcy5jaGF0Lm1vYmlsZUluZGljYXRvclwiLCBjaGVja1dyYXAoKSk7XG4gIH1cbn07XG5cblxuXG5cbi8qKlxuICogQXV0aGVudGljYXRlZCBMaXN0ZW5lclxuICpcbiAqXG4gKiBHcmlmZmlucyBVbml2ZXJzYWwgSGVhZGVyIHdpbGwgZGlzcGF0Y2ggZXZlbnQgdG8gbm90aWZ5XG4gKiBDaGF0IGlmIHVzZXIgaXMgeW91dGggb3Igbm90XG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgYXV0aGVudGljYXRlZExpc3RlbmVyID0gKCkgPT4ge1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgIFwiZGlnaXRhbERhdGEuYXV0aC5yZWFkeVwiLFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IHsgeW91dGhQcm9wRXhpc3QsIHlvdXRoUHJvcCB9ID0gdmVyaWZ5WW91dGhQcm9maWxlKCk7XG4gICAgICBpZiAoeW91dGhQcm9wRXhpc3QpIHtcbiAgICAgICAgaWYgKCF5b3V0aFByb3ApIHtcbiAgICAgICAgICBsb2FkQ2hhdFdpZGdldCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeW91dGhQcm9wKSByZXR1cm47XG4gICAgICB9XG4gICAgfSxcbiAgICB0cnVlXG4gICk7XG59O1xuXG4vKipcbiAqIFNpbmdsZSBQYWdlIEFwcGxpY2F0aW9uIExpc3RlbmVyXG4gKlxuICpcbiAqIExpc3RlbmVyIGZvciBiYWN0bS5vbignYWZ0ZXJQYWdldmlldycpXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3Qgc2luZ2xlUGFnZUFwcGxpY2F0aW9uTGlzdGVuZXIgPSAoKSA9PiB7XG4gIHRyeSB7XG4gICAgLy8gRW5zdXJlIGJhY3RtIGhhcyB0aGUgY29ycmVjdCB0eXBlIG9yIGNhc3QgaXQgdG8gYSB0eXBlIHRoYXQgaW5jbHVkZXMgJ29uJ1xuICAgICgoYmFjdG0gYXMgdW5rbm93bikgYXMgeyBvbjogKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBGdW5jdGlvbikgPT4gdm9pZCB9KT8ub24oXCJhZnRlclBhZ2V2aWV3XCIsIG9uQmFjdG1QYWdlVmlldyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBPbiBCYWN0bSBQYWdlIFZpZXdcbiAqXG4gKlxuICogQ2FsbGJhY2sgZm9yIHdoZW4gYmFjdG0ucGFnZXZpZXcgaXMgdHJpZ2dlcmVkXG4gKi9cbmNvbnN0IG9uQmFjdG1QYWdlVmlldyA9IChkYXRhOiB7IHBhZ2VJbmZvPzogeyBjaGF0PzogeyBkaXNhYmxlZD86IGJvb2xlYW47IHNpdGVfaWQ/OiBzdHJpbmcgfSB9IH0pID0+IHtcbiAgY29uc3QgY2hhdERpc2FibGVkID0gZGF0YT8ucGFnZUluZm8/LmNoYXQ/LmRpc2FibGVkIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHNpdGVJRCA9IGRhdGE/LnBhZ2VJbmZvPy5jaGF0Py5zaXRlX2lkO1xuICBjb25zdCBzZXJ2aWNlc0xpdmVQZXJzb25FbmFibGVkID0gKHdpbmRvdz8uZGlnaXRhbERhdGE/LnBhZ2U/LmF0dHJpYnV0ZXM/LmNoYXQgYXMgeyBzZXJ2aWNlc0xpdmVQZXJzb25FbmFibGVkPzogc3RyaW5nIH0pPy5zZXJ2aWNlc0xpdmVQZXJzb25FbmFibGVkO1xuICBjb25zdCBiYWN0bUNvb2tpZXMgPSBuZXcgYmFjdG0uQ29va2llcygpO1xuICBjb25zdCBjb29raWVFeGlzdHMgPSBiYWN0bUNvb2tpZXMuZ2V0KFwib2NjdENoYXRcIik7XG4gIGNvbnN0IG9jY3RDaGF0Q29va2llID0gY29va2llRXhpc3RzID8gSlNPTi5wYXJzZShjb29raWVFeGlzdHMpIDogXCJcIjtcbiAgY29uc3QgaXNDaGF0T25nb2luZyA9IG9jY3RDaGF0Q29va2llPy5zZWN1cmVLZXkgJiYgb2NjdENoYXRDb29raWUuc2VjdXJlS2V5ICE9PSBcIlwiO1xuICBpZiAoc2VydmljZXNMaXZlUGVyc29uRW5hYmxlZCA9PT0gXCJOT1wiICYmICFpc0NoYXRPbmdvaW5nKSByZXR1cm4gZmFsc2U7XG4gIGlmIChjaGF0RGlzYWJsZWQpIHNldENoYXRTaXRlKHsgc2l0ZUlEOiBmYWxzZSB9KTtcbiAgaWYgKHNpdGVJRCkgc2V0Q2hhdFNpdGUoeyBzaXRlSUQ6IHNpdGVJRCBhcyB1bmtub3duIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQgfSk7XG4gIHdpbmRvdz8uYm9hPy5jaGF0Py5yZWxvYWQoKTtcbn07XG5cbi8qKlxuICogU2V0IENoYXQgU2l0ZSBJRFxuICpcbiAqXG4gKiBTZXQgU0lURV9JRCAmIHNpdGVfaWQgaW5zaWRlIG9mIERET1xuICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gc2l0ZUlEXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3Qgc2V0Q2hhdFNpdGUgPSAoeyBzaXRlSUQgPSBmYWxzZSB9KSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY2hhdEF0dHJpYnV0ZXMgPSB3aW5kb3cuZGlnaXRhbERhdGEucGFnZS5hdHRyaWJ1dGVzLmNoYXQgYXMgeyBzaXRlX2lkPzogYm9vbGVhbiB8IHN0cmluZzsgU0lURV9JRD86IGJvb2xlYW4gfCBzdHJpbmcgfTtcbiAgICBjaGF0QXR0cmlidXRlcy5zaXRlX2lkID0gc2l0ZUlEO1xuICAgIGNoYXRBdHRyaWJ1dGVzLlNJVEVfSUQgPSBzaXRlSUQ7XG4gICAgd2luZG93LmNoYXRTcGFSZWFkeSA9IHRydWU7XG4gICAgd2luZG93Py5zcGFydGE/LmNoYXQ/LndpZGdldExvYWRlcj8ucHViKFwic3RhcnRDaGF0U1BBXCIsIHsgc2l0ZUlEIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5sb2coZSk7XG4gIH1cbn07XG5cbi8qKlxuICogVmVyaWZ5IFlvdXRoIFByb2ZpbGVcbiAqXG4gKlxuICogRmFtaWx5IEJhbmtpbmcgUHJvamVjdCAtIENoZWNrIGlmIHlvdXRoIHByb3BlcnR5IGV4aXN0XG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5jb25zdCB2ZXJpZnlZb3V0aFByb2ZpbGUgPSAoKSA9PiB7XG4gIGNvbnN0IHVzZXIgPSB3aW5kb3c/LmRpZ2l0YWxEYXRhPy51c2VyIGFzIHsgeW91dGg/OiBzdHJpbmcgfCBib29sZWFuIH07XG4gIGNvbnN0IHlvdXRoUHJvcEV4aXN0ID0gdXNlcj8uaGFzT3duUHJvcGVydHkoXCJ5b3V0aFwiKTtcbiAgY29uc3QgeW91dGhQcm9wID0gdXNlcj8ueW91dGggPT09IFwidHJ1ZVwiIHx8IHVzZXI/LnlvdXRoID09PSB0cnVlO1xuICByZXR1cm4geyB5b3V0aFByb3AsIHlvdXRoUHJvcEV4aXN0IH07XG59O1xuXG4vKipcbiAqIFN0YXJ0IFNpbmdsZSBQYWdlIEFwcGxpY2F0aW9uXG4gKlxuICpcbiAqIFN0YXJ0IGEgU2luZ2xlIFBhZ2UgQXBwbGljYXRpb24gaWYgaXNTcGEgaXMgcG91cGxhdGVkXG4gKiBib29sZWFuIHRydWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBzdGFydFNpbmdsZVBhZ2VBcHBsaWNhdGlvbiA9ICgpID0+IHtcbiAgY29uc3QgZGVsYXllZENoYXQgPSB7IGZpcmVkOiBmYWxzZSB9O1xuICBjb25zdCBwYWdlVmlld3MgPSBBcnJheS5pc0FycmF5KHdpbmRvdz8uZGF0YUNvbGxlY3RvcilcbiAgICA/IHdpbmRvdy5kYXRhQ29sbGVjdG9yLmZpbHRlcigoeyBldmVudCB9KSA9PiBldmVudCA9PT0gXCJwYWdldmlld1wiKVxuICAgIDogW107XG4gIGlmIChwYWdlVmlld3MubGVuZ3RoID09PSAwKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJndC5zaG93Q2hhdC5yZWFkeVwiLCAoZSkgPT4ge1xuICAgICAgaWYgKGRlbGF5ZWRDaGF0LmZpcmVkKSByZXR1cm47XG4gICAgICBzaW5nbGVQYWdlQXBwbGljYXRpb25MaXN0ZW5lcigpO1xuICAgICAgZGVsYXllZENoYXQuZmlyZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBwYWdlVmlldyA9IHBhZ2VWaWV3c1twYWdlVmlld3MubGVuZ3RoIC0gMV07XG4gIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgcGFnZUluZm86IGRpZ2l0YWxEYXRhPy5wYWdlPy5wYWdlSW5mbz8uW3BhZ2VWaWV3LnBhZ2VJbmZvS2V5XSxcbiAgfTtcbiAgb25CYWN0bVBhZ2VWaWV3KHBheWxvYWQpO1xuICBzaW5nbGVQYWdlQXBwbGljYXRpb25MaXN0ZW5lcigpO1xufTtcblxuLyoqXG4gKiBTdGFydCBDaGF0IFBsYXRmb3JtXG4gKlxuICpcbiAqIEJlZ2lubmluZyBvZiBDaGF0IFBsYXRmb3JtLiBGaXJzdCBsaW5lIG9mIGNvZGUuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3Qgc3RhcnRDaGF0UGxhdGZvcm0gPSAoKSA9PiB7XG4gIGNvbnN0IGlzQXV0aGVudGljYXRlZCA9IGlzVW5pdmVyc2FsSGVhZGVyKCk7XG4gIGNvbnN0IGRpc2FibGVDaGF0ID1cbiAgICB3aW5kb3cuZGlnaXRhbERhdGEgJiYgd2luZG93LmRpZ2l0YWxEYXRhLmRpc2FibGVDaGF0T25Mb2FkID09PSB0cnVlO1xuXG4gIGlmIChkaXNhYmxlQ2hhdCkge1xuICAgIFRlYWxpdW1QdWJTdWIuc3Vic2NyaWJlKElOSVRfQ0hBVCwgKCkgPT4ge30pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgbG9hZENoYXRXaWRnZXQoKTtcbiAgICBpZiAod2luZG93Py5kaWdpdGFsRGF0YT8ucGFnZT8uYXR0cmlidXRlcz8uY2hhdD8uaXNTcGEpIHtcbiAgICAgIHN0YXJ0U2luZ2xlUGFnZUFwcGxpY2F0aW9uKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh3aW5kb3c/LmRpZ2l0YWxEYXRhPy5wYWdlPy5hdHRyaWJ1dGVzPy5jaGF0Py5pc1NwYSkge1xuICAgIGxvYWRDaGF0V2lkZ2V0KCk7XG4gICAgc3RhcnRTaW5nbGVQYWdlQXBwbGljYXRpb24oKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB7IHlvdXRoUHJvcEV4aXN0LCB5b3V0aFByb3AgfSA9IHZlcmlmeVlvdXRoUHJvZmlsZSgpO1xuXG4gIGlmICh5b3V0aFByb3BFeGlzdCkge1xuICAgIGlmICgheW91dGhQcm9wKSB7XG4gICAgICBsb2FkQ2hhdFdpZGdldCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoeW91dGhQcm9wKSByZXR1cm47XG4gIH1cblxuICBhdXRoZW50aWNhdGVkTGlzdGVuZXIoKTtcbn07XG5cbigoKSA9PiBzdGFydENoYXRQbGF0Zm9ybSgpKSgpO1xuIl0sIm5hbWVzIjpbIkFDU19MT0dHRVJfVVJMIiwibG9nR2VuZXN5c0V2ZW50IiwibW9iaWxlQUNTTG9nZ2VyU2VydmljZSIsImxhYmVsIiwiZXJyb3IiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImhyZWYiLCJpbmNsdWRlcyIsImJhY3RtX2VudlNlbGVjdG9yIiwiZXJyb3JQYXlsb2FkIiwiY29uY2F0IiwibWVzc2FnZSIsImRvbWFpbiIsIm9yaWdpbiIsInJlcGxhY2UiLCJlcnJvclVSTCIsImZldGNoIiwiaGVhZGVycyIsIkFjY2VwdCIsIm1ldGhvZCIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwiY3JlZGVudGlhbHMiLCJ0aGVuIiwicmVzIiwiY29uc29sZSIsImxvZyIsImUiXSwic291cmNlUm9vdCI6IiJ9
} } catch(e){ utag.DB(e) } }];
u.send = function(a, b) {
if (u.ev[a] || u.ev.all !== undefined) {
//##UTENABLEDEBUG##utag.DB("send:##UTID##");
var c, d, e, f, i;
u.data = {
/* Initialize default tag parameter values here */
/* Examples: */
/* "account_id" : "1234567" */
/* "base_url" : "//insert.your.javascript.library.url.here.js" */
/* A value mapped to "account_id" or "base_url" in TiQ will replace these default values. */
};
/* Start Tag-Scoped Extensions Code */
/* Please Do Not Edit This Section */
for(c=0;c